ScriptForge fix tdf#168433 array.ImportFromCSVFile
The import of a CSV-formatted file into an array fails when specific combinations of double quotes and commas (= delimiter) are present. The array.ImportFromCSVFile() method uses internally the string.SplitNotQuoted() method for parsing the input records. The latter method skips the delimiters located inside quoted strings. It was buggy and needed a revision. Documentation unchanged. Change-Id: Ie156455b99749c6a8e4f43f4d3c258772904848f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191227 Tested-by: Jenkins Reviewed-by: Jean-Pierre Ledure <jp@ledure.be>
This commit is contained in:
@@ -2281,7 +2281,7 @@ Public Function SplitNotQuoted(Optional ByRef InputStr As Variant _
|
||||
''' Args:
|
||||
''' InputStr: the input string
|
||||
''' Might contain quoted substrings:
|
||||
''' The quoting character must be the double quote (")
|
||||
''' The quoting character must be the double quote ["] (default) or the single quote [']
|
||||
''' To preserve a quoting character inside the quoted substring, use (\) or (") as escape character
|
||||
''' => [str\"i""ng] means [str"i"ng]
|
||||
''' Delimiter: A string of one or more characters that is used to delimit the input string
|
||||
@@ -2303,7 +2303,6 @@ Dim vEnd As Variant ' Array of end positions of quoted strings
|
||||
Dim lInStr As Long ' InStr() on input string
|
||||
Dim lInStrPrev As Long ' Previous value of lInputStr
|
||||
Dim lBound As Long ' UBound of vStart and vEnd
|
||||
Dim lMin As Long ' Lower bound to consider when searching vStart and vEnd
|
||||
Dim oCharacterClass As Object ' com.sun.star.i18n.CharacterClassification
|
||||
Dim oLocale As Object ' com.sun.star.lang.Locale
|
||||
Dim oParse As Object ' com.sun.star.i18n.ParseResult
|
||||
@@ -2366,22 +2365,20 @@ Try:
|
||||
vSplit = Split(InputStr, Delimiter, Occurrences)
|
||||
Else
|
||||
' Split chunk by chunk
|
||||
lMin = 0
|
||||
lInStrPrev = 0
|
||||
lInStr = InStr(1, InputStr, Delimiter, 0)
|
||||
Do While lInStr > 0
|
||||
If Occurrences > 0 And Occurrences = UBound(vSplit) - 1 Then Exit Do
|
||||
bSplit = False
|
||||
' Ignore found Delimiter if in quoted string
|
||||
For i = lMin To lBound
|
||||
For i = 0 To lBound
|
||||
If lInStr < vStart(i) Then
|
||||
bSplit = True
|
||||
Exit For
|
||||
ElseIf lInStr > vStart(i) And lInStr < vEnd (i) Then
|
||||
Exit For
|
||||
Else
|
||||
lMin = i + 1
|
||||
If i = lBound Then bSplit = True Else bSplit = ( lInStr < vStart(lMin) )
|
||||
If i = lBound Then bSplit = True Else bSplit = ( lInStr < vStart(i + 1) )
|
||||
End If
|
||||
Next i
|
||||
' Build next chunk and store in split array
|
||||
|
||||
Reference in New Issue
Block a user