Я пытаюсь прочитать .csv для работы с ним в .accdbVBA читает CSV с разделителем в строке
Файл имеет; как разделитель и «» в качестве классификатора строк. Молодой и наивный, как и я, я просто разбить файл на разделителе:
Set oFSO = New FileSystemObject
Set oStream = oFSO.OpenTextFile(sFilePath, ForReading)
Do Until oStream.AtEndOfStream
sLine = oStream.ReadLine
sArray = Split(sLine, ";")
....
Теперь я получил строку:
"String";"Str;ing";0;0;0;"String"
Так что я разделителем внутри одной из строк, что делает код выше не работает. Есть идеи, как это решить?
EDIT:
Я нашел кого-то с подобной проблемой, только с запятой в качестве разделителя. И они решили это, используя регулярные выражения. Проблема: Я не очень хорошо разбираюсь в регулярных выражениях. В этом примере используется это выражение и код:
Function regLine(sLine As String) As String
Dim oRegEx As RegExp
Set oRegEx = New RegExp
oRegEx.IgnoreCase = True
oRegEx.Global = True
' Pattern: ",(?=([^"]*"[^"]*")*(?![^"]*"))"
oRegEx.Pattern = ",(?=([^" & Chr(34) & "]*" & Chr(34) & "[^" & Chr(34) & "]*" & Chr(34) & ")*(?![^" & Chr(34) & "]*" & Chr(34) & "))"
regLine = oRegEx.Replace(sLine, ";")
End Function
Так что я не совсем понимаю выражение. Моя первая идея состояла в том, чтобы заменить запятую точкой с запятой, но это не сработало.
Не уверен, что я сделал что-то не так, но для меня строка вывода выглядит как ;; 0; 0; 0; "String" – FNR
@FNR, чтобы протестировать, скопировать код, сохранить как 'test.vbs', запустить с' cscript test.vbs' выполнить на консоли или дважды щелкнуть по файлу. Я также тестировал его как VBA в excel, заменяя 'Wcript.Echo' на' MsgBox', включая ссылку на 'Microsoft VBScript Regular Expressions' или используя' CreateObject («VBScript.RegExp») ', и в обоих случаях он работает ,Пожалуйста, включите в свой вопрос код, который вы используете, чтобы мы могли увидеть, где он может потерпеть неудачу. –
'Set oRegEx = Новый RegExp oRegEx.Global = True oRegEx.Pattern =" ("" [^ ""] * "") ?; " sLine2 = oRegEx.Replace (sLine, ";") regLine = Split (sLine2, ";") ' sLine - это такая же строка, что и в моем исходном сообщении – FNR