Skip to content

Commit 4cdb2cb

Browse files
committed
Update CSVinterface.cls
1 parent b816f07 commit 4cdb2cb

File tree

1 file changed

+69
-44
lines changed

1 file changed

+69
-44
lines changed

src/CSVinterface.cls

Lines changed: 69 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,14 +1410,14 @@ ImportFromCSV_EmptyString:
14101410
Resume ErrHandler_ImportFromString
14111411
End Function
14121412

1413-
Public Function IsJaggedArray(Arr As Variant) As Boolean
1413+
Public Function IsJaggedArray(arr As Variant) As Boolean
14141414
On Error GoTo IsJaggedArray_Err_Handler
1415-
If IsArray(Arr) Then
1416-
If MultiDimensional(Arr) Then
1415+
If IsArray(arr) Then
1416+
If MultiDimensional(arr) Then
14171417
IsJaggedArray = False
14181418
Else
14191419
Dim BoundingTest As Variant
1420-
BoundingTest = Arr(LBound(Arr))
1420+
BoundingTest = arr(LBound(arr))
14211421
BoundingTest = LBound(BoundingTest)
14221422
IsJaggedArray = True
14231423
End If
@@ -1485,11 +1485,14 @@ Private Function JoinRecordsFields(ByRef RecordsArray As Variant, _
14851485
Dim CoerceChr As String
14861486
Dim ConcatenatedArray() As String
14871487
Dim EscapeT As EscapeTokens
1488+
Dim FieldDelimiterInField As Boolean
14881489
Dim FldDelimiter As String
14891490
Dim iLCounter As Long, jLCounter As Long
14901491
Dim JoinBuffer(0 To 2) As String
14911492
Dim LB1 As Long, UB1 As Long
14921493
Dim LB2 As Long, ub2 As Long
1494+
Dim MultiLineField As Boolean
1495+
Dim QuotesInField As Boolean
14931496
Dim recDelimiter As String
14941497

14951498
On Error GoTo JoinRecordsFields_Error
@@ -1528,15 +1531,17 @@ Private Function JoinRecordsFields(ByRef RecordsArray As Variant, _
15281531
ub2 = UBound(tmpBuffer)
15291532
ReDim Buffer(LB2 To ub2)
15301533
For jLCounter = LB2 To ub2
1531-
If InStrB(1, tmpBuffer(jLCounter), FldDelimiter) Then
1532-
JoinBuffer(1) = tmpBuffer(jLCounter)
1533-
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1534-
ElseIf InStrB(1, tmpBuffer(jLCounter), CoerceChr) Then
1535-
JoinBuffer(1) = tmpBuffer(jLCounter)
1536-
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1537-
ElseIf InStrB(1, tmpBuffer(jLCounter), recDelimiter) Then
1534+
FieldDelimiterInField = InStrB(1, tmpBuffer(jLCounter), FldDelimiter)
1535+
MultiLineField = InStrB(1, tmpBuffer(jLCounter), recDelimiter)
1536+
QuotesInField = InStrB(1, tmpBuffer(jLCounter), CoerceChr)
1537+
If FieldDelimiterInField Or MultiLineField Or QuotesInField Then
15381538
JoinBuffer(1) = tmpBuffer(jLCounter)
15391539
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1540+
If QuotesInField Then
1541+
If OddQuotes(Buffer(jLCounter), CoerceChr) Then
1542+
Buffer(jLCounter) = Buffer(jLCounter) & CoerceChr
1543+
End If
1544+
End If
15401545
Else
15411546
Buffer(jLCounter) = tmpBuffer(jLCounter)
15421547
End If
@@ -1564,15 +1569,17 @@ Private Function JoinRecordsFields(ByRef RecordsArray As Variant, _
15641569
'Concatenate fields
15651570
For iLCounter = LB1 To UB1
15661571
For jLCounter = LB2 To ub2
1567-
If InStrB(1, RecordsArray(iLCounter, jLCounter), FldDelimiter) Then
1568-
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
1569-
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1570-
ElseIf InStrB(1, RecordsArray(iLCounter, jLCounter), CoerceChr) Then
1571-
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
1572-
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1573-
ElseIf InStrB(1, RecordsArray(iLCounter, jLCounter), recDelimiter) Then
1572+
FieldDelimiterInField = InStrB(1, RecordsArray(iLCounter, jLCounter), FldDelimiter)
1573+
MultiLineField = InStrB(1, RecordsArray(iLCounter, jLCounter), recDelimiter)
1574+
QuotesInField = InStrB(1, RecordsArray(iLCounter, jLCounter), CoerceChr)
1575+
If FieldDelimiterInField Or MultiLineField Or QuotesInField Then
15741576
JoinBuffer(1) = RecordsArray(iLCounter, jLCounter)
15751577
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1578+
If QuotesInField Then
1579+
If OddQuotes(Buffer(jLCounter), CoerceChr) Then
1580+
Buffer(jLCounter) = Buffer(jLCounter) & CoerceChr
1581+
End If
1582+
End If
15761583
Else
15771584
Buffer(jLCounter) = RecordsArray(iLCounter, jLCounter)
15781585
End If
@@ -1600,15 +1607,17 @@ Private Function JoinRecordsFields(ByRef RecordsArray As Variant, _
16001607
'@----------------------------------------------------------------------------
16011608
'Concatenate fields
16021609
For iLCounter = LB1 To UB1
1603-
If InStrB(1, RecordsArray(iLCounter), FldDelimiter) Then
1604-
JoinBuffer(1) = RecordsArray(iLCounter)
1605-
Buffer(0) = Join$(JoinBuffer, vbNullString)
1606-
ElseIf InStrB(1, RecordsArray(iLCounter), CoerceChr) Then
1607-
JoinBuffer(1) = RecordsArray(iLCounter)
1608-
Buffer(0) = Join$(JoinBuffer, vbNullString)
1609-
ElseIf InStrB(1, RecordsArray(iLCounter), recDelimiter) Then
1610+
FieldDelimiterInField = InStrB(1, RecordsArray(iLCounter), FldDelimiter)
1611+
MultiLineField = InStrB(1, RecordsArray(iLCounter), CoerceChr)
1612+
QuotesInField = InStrB(1, RecordsArray(iLCounter), CoerceChr)
1613+
If FieldDelimiterInField Or MultiLineField Or QuotesInField Then
16101614
JoinBuffer(1) = RecordsArray(iLCounter)
16111615
Buffer(0) = Join$(JoinBuffer, vbNullString)
1616+
If QuotesInField Then
1617+
If OddQuotes(Buffer(0), CoerceChr) Then
1618+
Buffer(0) = Buffer(0) & CoerceChr
1619+
End If
1620+
End If
16121621
Else
16131622
Buffer(0) = RecordsArray(iLCounter)
16141623
End If
@@ -1634,15 +1643,17 @@ Private Function JoinRecordsFields(ByRef RecordsArray As Variant, _
16341643
ub2 = UBound(tmpBuffer)
16351644
ReDim Buffer(LB2 To ub2)
16361645
For jLCounter = LB2 To ub2
1637-
If InStrB(1, tmpBuffer(jLCounter), FldDelimiter) Then
1638-
JoinBuffer(1) = tmpBuffer(jLCounter)
1639-
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1640-
ElseIf InStrB(1, tmpBuffer(jLCounter), CoerceChr) Then
1641-
JoinBuffer(1) = tmpBuffer(jLCounter)
1642-
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1643-
ElseIf InStrB(1, tmpBuffer(jLCounter), recDelimiter) Then
1646+
FieldDelimiterInField = InStrB(1, tmpBuffer(jLCounter), FldDelimiter)
1647+
MultiLineField = InStrB(1, tmpBuffer(jLCounter), recDelimiter)
1648+
QuotesInField = InStrB(1, tmpBuffer(jLCounter), CoerceChr)
1649+
If FieldDelimiterInField Or MultiLineField Or QuotesInField Then
16441650
JoinBuffer(1) = tmpBuffer(jLCounter)
16451651
Buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
1652+
If QuotesInField Then
1653+
If OddQuotes(Buffer(jLCounter), CoerceChr) Then
1654+
Buffer(jLCounter) = Buffer(jLCounter) & CoerceChr
1655+
End If
1656+
End If
16461657
Else
16471658
Buffer(jLCounter) = tmpBuffer(jLCounter)
16481659
End If
@@ -1727,6 +1738,20 @@ ErrHandler_MultiDimensional:
17271738
MultiDimensional = False '1 dimension
17281739
End Function
17291740

1741+
Private Function OddQuotes(ByRef FieldStr As String, ByRef quoteChar As String) As Boolean
1742+
Dim curQuotePos As Long
1743+
Dim matchCounter As Long
1744+
Dim res As Long
1745+
1746+
matchCounter = 0
1747+
curQuotePos = InStrB(1, FieldStr, quoteChar)
1748+
Do While curQuotePos
1749+
matchCounter = matchCounter + 1
1750+
curQuotePos = InStrB(curQuotePos + 1, FieldStr, quoteChar)
1751+
Loop
1752+
OddQuotes = (matchCounter Mod 2)
1753+
End Function
1754+
17301755
Public Sub OpenSeqReader(configObj As parserConfig, _
17311756
ParamArray FilterColumns() As Variant)
17321757
On Error GoTo OpenSeqReader_Error_Handler
@@ -2379,7 +2404,7 @@ End Sub
23792404

23802405
Private Sub SkipUnwantedLines(ByRef idx As Long, _
23812406
ByRef MaxIdx As Long, _
2382-
ByRef Arr() As String, _
2407+
ByRef arr() As String, _
23832408
ByVal CommentToken As Long, _
23842409
Optional SkipComments As Boolean = True, _
23852410
Optional skipEmptyLines As Boolean = True)
@@ -2391,14 +2416,14 @@ Private Sub SkipUnwantedLines(ByRef idx As Long, _
23912416
'Skip commented and empty lines if needed
23922417
If idx <= MaxIdx Then
23932418
Do
2394-
CurLength = LenB(Arr(idx))
2419+
CurLength = LenB(arr(idx))
23952420
UnwantedLine = False
23962421
If CurLength = 0 Then 'Empty line found
23972422
If skipEmptyLines Then
23982423
UnwantedLine = True
23992424
End If
24002425
Else
2401-
CharCode = AscW(Arr(idx))
2426+
CharCode = AscW(arr(idx))
24022427
If CharCode = CommentToken Then 'Commented line found
24032428
If SkipComments Then
24042429
UnwantedLine = True
@@ -2960,7 +2985,7 @@ End Sub
29602985

29612986
Private Sub StreamSkipUnwantedLines(ByRef idx As Long, _
29622987
ByRef Ostream As ECPTextStream, _
2963-
ByRef Arr() As String, _
2988+
ByRef arr() As String, _
29642989
ByRef MaxIdx As Long, _
29652990
ByRef recDelimiter As String, _
29662991
ByVal CommentToken As Long, _
@@ -2976,14 +3001,14 @@ start:
29763001
'Skip commented and blank lines if needed
29773002
If idx <= MaxIdx Then
29783003
Do
2979-
CurLength = LenB(Arr(idx))
3004+
CurLength = LenB(arr(idx))
29803005
UnwantedLine = False
29813006
If CurLength = 0 Then 'Empty line found
29823007
If skipEmptyLines Then
29833008
UnwantedLine = True
29843009
End If
29853010
Else
2986-
CharCode = AscW(Arr(idx))
3011+
CharCode = AscW(arr(idx))
29873012
If CharCode = CommentToken Then 'Commented line found
29883013
If SkipComments Then
29893014
UnwantedLine = True
@@ -2999,10 +3024,10 @@ AdvanceLine:
29993024
'Advance stream
30003025
Ostream.ReadText
30013026
QuotedStreamVariable = InStrB(1, Ostream.bufferString, CHR_DOUBLE_QUOTES)
3002-
Arr() = Split(Ostream.bufferString, recDelimiter)
3027+
arr() = Split(Ostream.bufferString, recDelimiter)
30033028
idx = 0
3004-
MaxIdx = UBound(Arr)
3005-
If Arr(MaxIdx) = vbNullString Then
3029+
MaxIdx = UBound(arr)
3030+
If arr(MaxIdx) = vbNullString Then
30063031
MaxIdx = MaxIdx - 1
30073032
End If
30083033
End If
@@ -3015,10 +3040,10 @@ AdvanceLine:
30153040
'Advance stream
30163041
Ostream.ReadText
30173042
QuotedStreamVariable = InStrB(1, Ostream.bufferString, CHR_DOUBLE_QUOTES)
3018-
Arr() = Split(Ostream.bufferString, recDelimiter)
3043+
arr() = Split(Ostream.bufferString, recDelimiter)
30193044
idx = 0
3020-
MaxIdx = UBound(Arr)
3021-
If Arr(MaxIdx) = vbNullString Then
3045+
MaxIdx = UBound(arr)
3046+
If arr(MaxIdx) = vbNullString Then
30223047
MaxIdx = MaxIdx - 1
30233048
End If
30243049
GoTo start

0 commit comments

Comments
 (0)