Функция MS Access Split с вложенным текстом - PullRequest
0 голосов
/ 26 ноября 2011

Я пытаюсь загружать текстовые файлы в базу данных построчно, я не могу использовать стандартный метод импорта, поскольку разбивка файла означает, что каждая строка имеет разное количество столбцов, однако, к счастью, она разделена запятыми.

Я пытаюсь использовать функцию «Разделить», чтобы можно было извлечь определенную информацию из каждой строки, к сожалению, любые текстовые поля заключены в «», а некоторые будут содержать запятые в указанном тексте.

Можно ли использовать функцию Split и игнорировать любые запятые, попадающие в закрытый текст, если нет, то я рад написать пользовательскую функцию, но можно ли определить, заключена ли текстовая строка в ""?

Спасибо и С уважением,

Мат.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Большое спасибо mwolfem. Мне жаль говорить, что я еще не тестировал ваш код, но в моем случае я хочу выбрать определенные значения из моей строки, не печатая всю строку, однако после небольшого дополнительного исследования у меня есть Рабочее решение для всех, кто борется с этой проблемой, заключается в следующем:

Создайте эту первую функцию в модуле:

Public Function DelimConvertor(varInput As Variant, strDelim As String, strQualifier As String) As Variant

Const strStart = "Ã" 'Ascii 195, or any other Ascii you are unlikely to encounter
Const strEnd = "ž" 'Ascii 158, or any other Ascii you are unlikely to encounter
Const strNewDelim = "§" 'Ascii 167, or any other Ascii you are unlikely to encounter

Dim lngi        As Long
Dim strChar     As String
Dim flgStart    As Boolean
Dim varOutput   As Variant

'Format the string so we can distinguish the fields

If Left(varInput, 1) = strQualifier Then
varInput = strStart & Right(varInput, Len(varInput) - 1)
End If

If Right(varInput, 1) = strQualifier Then
varInput = Left(varInput, Len(varInput) - 1) & strEnd 
End If

varInput = Replace(varInput, strDelim & strQualifier, strDelim & strStart)

varInput = Replace(varInput, strQualifier & strDelim, strEnd & strDelim)

'Loop through and format the rest of the string

For lngi = 1 To Len(varInput)

strChar = Mid(varInput, lngi, 1)

Select Case strChar

Case strStart

flgStart = True

Case strEnd

flgStart = False

Case Else

If flgStart Then

varOutput = varOutput & strChar

ElseIf strChar = strDelim Then

varOutput = varOutput & strNewDelim

Else

varOutput = varOutput & strChar

End If

End Select

Next

'Return the cleansed stream that can now be used with the Split function

DelimConvertor = varOutput

End Function

И затем вы используете его во время импорта файла с чем-то вроде следующего:

Public Function Test()

Dim fso         As New FileSystemObject
Dim ts          As TextStream
Dim strArray()  As String

Set ts = fso.OpenTextFile("C:\Users\Admin\Desktop\test.txt", ForReading)

strArray = Split(DelimConvertor(ts.ReadLine, ",", """"), "§")

'Obtain your desired field here e.g. strArray(0)

ts.Close

End Function
0 голосов
/ 27 ноября 2011

Я не думаю, что это возможно сделать с помощью функции Split.Я на самом деле пытался сделать то же самое в последнее время (но с кавычками вместо кавычек).У меня есть пользовательская функция, которую я написал, которую я обобщил, чтобы принимать любой разделитель и любое количество пар "символов кавычек";например, (), [], {}, "" и т. д.

Function SplitUnquotedSections(Text As String, Delimiter As String, _
                               ParamArray QuotePairs()) As Collection
Dim Char As String, Word As String, i As Integer, Pos As Long, Unquote As String

    Set SplitUnquotedSections = New Collection
    For Pos = 1 To Len(Text)
        Char = Mid(Text, Pos, 1)
        If Len(Unquote) = 0 Then
            If Char = Delimiter Then
                SplitUnquotedSections.Add Word
                Word = ""
            Else
                For i = LBound(QuotePairs) To UBound(QuotePairs) Step 2
                    If Char = QuotePairs(i) Then
                        Unquote = QuotePairs(i + 1)
                        Exit For
                    End If
                Next i
                Word = Word & Char
            End If
        Else
            Word = Word & Char
            If Char = Unquote Then
                Unquote = ""
            End If
        End If
    Next Pos
    If Len(Word) > 0 Then SplitUnquotedSections.Add Word

End Function

Функция возвращает коллекцию, поэтому вы можете использовать ее следующим образом:

Sub TestSplit()
Const TestString As String = """Times Square"", ""New York, NY"", 10011"
Dim Item As Variant

    For Each Item In SplitUnquotedSections(TestString, ",", """", """")
        Debug.Print Trim(Item)
    Next Item
End Sub


"Times Square"
"New York, NY"
10011
...