Как пропустить разделение строки с разделителями внутри массива строк в VBA - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть макрос VBA, где мне нужно получить splitStr (1) = str2, str3;splitStr (2) = str4; ....

string1 = "str1,""str2,str3"",str4,str5,str6"
splitStr = Split(string1,",")

Debug.Print splitStr(1)
"str2    

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Разделение строк с сохранением токенов в кавычках

Попробуйте этот подход, используя временное преобразование в тип ► 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 разрешить дополнительные проверки: -)

0 голосов
/ 20 сентября 2018

Функция Split(expression [,delimiter] [,limit] [,compare] ) выполняет поиск по строковому символу за символом в поисках разделителя или подстроки по подстроке в зависимости от вашего разделителя.У вас есть несколько вариантов:

  1. Используйте Split(string1,",") и получите результирующий массив в splitStr следующим образом:

    splitStr(0) = str1
    splitStr(1) = "str2
    splitStr(2) = str3"
    splitStr(3) = str4
    splitStr(4) = str5
    splitStr(5) = str6
    

Затем используйтеследующий код, чтобы «исправить» ваш результат так, как вы хотите

    splitStr(1) = Replace(splitStr(1), """", "") & Replace(splitStr(2), """", "")
    'splitStr(1) now contains str2str3
    'splitStr(2) still contains str3" 
...