@@ -1410,14 +1410,14 @@ ImportFromCSV_EmptyString:
14101410 Resume ErrHandler_ImportFromString
14111411End 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
17281739End 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+
17301755Public Sub OpenSeqReader (configObj As parserConfig , _
17311756 ParamArray FilterColumns() As Variant )
17321757 On Error GoTo OpenSeqReader_Error_Handler
@@ -2379,7 +2404,7 @@ End Sub
23792404
23802405Private 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
29612986Private 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