Разделение строк с сохранением токенов в кавычках
Попробуйте этот подход, используя временное преобразование в тип ► Byte
, что позволяет быстрее проходить по строкам.
Метод
В основном все запятые в кавычках временно преобразуются в другой символ (например, точку с запятой), поэтомучто вы можете разделить как обычно, подставив в конце точки с запятой в нормальные запятые.
См. Дальнейшие объяснения в следующем примере кода:
Sub testByte()
Const COMMA& = 44, QUOT& = 34, SEMI& = 59 ' constants for comma, quot.mark, semicolon
Dim b() As Byte, i As Long, bQU As Boolean
Dim string1$, sTemp$
' [0] string to be splitted
string1 = "str1,""str2,str3"",str4,str5,str6"
' [1] temporary conversion of commatas in quotations to another character using the BYTE type
b = string1 ' Assign string to bytes
For i = 0 To UBound(b) Step 2 ' check each bytes representation of character
If b(i) = QUOT Then bQU = IIf(bQU, False, True) ' check quotation starts
If bQU Then If b(i) = COMMA Then b(i) = SEMI ' change commata in quotation to temporary semicolons
Next i
sTemp = b ' convert bytes to normal string type
' [2] split as usual
Dim splitStr As Variant
splitStr = Split(sTemp, ",")
' [3] check all results
For i = 0 To UBound(splitStr) ' list all splitted items and ...
Debug.Print i, Replace(splitStr(i), ";", ",") ' ... change semicolons back to normal commata
Next i
End Sub
'Results in immediate window
'---------------------------
'0 str1
'1 "str2,str3"
'2 str4
'3 str5
'4 str6
Примечание
Конечно, существует некоторая преднамеренная избыточность в переменных string1
иsTemp
разрешить дополнительные проверки: -)