@@ -93,6 +93,9 @@ Private P_ESCAPE_CHAR As EscapeType '------------Holds the char used for escape
9393Private P_FIELDS_DELIMITER As String '-----------Holds the current delimiter for CSV fields
9494Private P_FILEENCODING As String '---------------Holds the encoding for the opened CSV file
9595Private P_FILENAME As String '-------------------Holds the actual file name
96+ Private P_NEED_SHRINK As Boolean '---------------When TRUE the P_CSV_DATA array need to be shrinked
97+ Private P_OUTPUT_UB1 As Long '-------------------Holds the max 1stD used index in the P_CSV_DATA array
98+ Private P_OUTPUT_UB2 As Long '-------------------Holds the max 2ndD used index in the P_CSV_DATA array
9699Private P_QUOTING_MODE As QuotationMode '--------Hols the mode used for fields quotation.
97100Private P_RECORDS_DELIMITER As String '----------Holds the records delimiter (CR, LF or CRLF)
98101Private P_STARTING_RECORD As Long '--------------Pointer to the first record to be imported
@@ -258,6 +261,7 @@ End Function
258261Private Sub CloseConnection ()
259262Attribute CloseConnection.VB_Description = "Closes a connection that point to the memory opened CSV file."
260263 On Error GoTo ErrHandler_CloseConnection
264+ '@------------------------------------------------------
261265 'Close the last opened file
262266 Close #FileHandled
263267 P_ERROR_DESC = vbNullString
@@ -298,8 +302,22 @@ End Function
298302Public Sub DumpToArray (OutPutArray() As String )
299303Attribute DumpToArray.VB_Description = "Dumps the CSV data from the current instance to a 2D array."
300304Attribute DumpToArray.VB_UserMemId = 0
301- OutPutArray() = P_CSV_DATA
302- Erase P_CSV_DATA
305+ If P_SUCCESSFUL_IMPORT Then
306+ If Not P_NEED_SHRINK Then
307+ OutPutArray() = P_CSV_DATA
308+ Else
309+ Dim Counter1 As Long , Counter2 As Long
310+ ReDim OutPutArray(0 To P_OUTPUT_UB1, 0 To P_OUTPUT_UB2)
311+ For Counter1 = 0 To P_OUTPUT_UB1
312+ For Counter2 = 0 To P_OUTPUT_UB2
313+ OutPutArray(Counter1, Counter2) = P_CSV_DATA(Counter1, Counter2)
314+ P_CSV_DATA(Counter1, Counter2) = vbNullString 'Release memory
315+ Next Counter2
316+ Next Counter1
317+ End If
318+ P_SUCCESSFUL_IMPORT = False
319+ Erase P_CSV_DATA
320+ End If
303321End Sub
304322Public Sub DumpToSheet (Optional WBookName As String , _
305323 Optional SheetName As String , _
@@ -329,17 +347,41 @@ Attribute DumpToSheet.VB_Description = "Dumps the CSV data from the current inst
329347 Set OutputSheet = WBook.Sheets.Add
330348 End If
331349 '@------------------------------------------------------
332- 'Set the target Range
333- Set OutputRange = OutputSheet.Range(rngName) _
350+ 'Dump the data
351+ If Not P_NEED_SHRINK Then
352+ '@------------------------------------------------------
353+ 'Set the target Range
354+ Set OutputRange = OutputSheet.Range(rngName) _
334355 .Resize _
335356 ( _
336357 UBound(P_CSV_DATA, 1 ) - LBound(P_CSV_DATA, 1 ) + 1 , _
337358 UBound(P_CSV_DATA, 2 ) - LBound(P_CSV_DATA, 2 ) + 1 _
338359 )
339- '@------------------------------------------------------
340- 'Dump the data
341- OutputRange.Value2 = P_CSV_DATA
360+ OutputRange.Value2 = P_CSV_DATA
361+ Else
362+ '@------------------------------------------------------
363+ 'Set the target Range
364+ Set OutputRange = OutputSheet.Range(rngName) _
365+ .Resize _
366+ ( _
367+ P_OUTPUT_UB1 + 1 , _
368+ P_OUTPUT_UB2 + 1 _
369+ )
370+ Dim Counter1 As Long , Counter2 As Long
371+ Dim tmpOutputArray() As String
372+ ReDim tmpOutputArray(0 To P_OUTPUT_UB1, 0 To P_OUTPUT_UB2)
373+ For Counter1 = 0 To P_OUTPUT_UB1
374+ For Counter2 = 0 To P_OUTPUT_UB2
375+ tmpOutputArray(Counter1, Counter2) = P_CSV_DATA(Counter1, Counter2)
376+ P_CSV_DATA(Counter1, Counter2) = vbNullString 'Release memory
377+ Next Counter2
378+ Next Counter1
379+ OutputRange.Value2 = tmpOutputArray
380+ Erase tmpOutputArray
381+ End If
342382 EnableOptimization False
383+ P_SUCCESSFUL_IMPORT = False
384+ Erase P_CSV_DATA
343385 End If
344386End Sub
345387Private Sub EnableOptimization (Optional Optimize As Boolean = True )
@@ -708,12 +750,20 @@ Attribute JoinRecordsFields.VB_Description = "Joins all fields for each record i
708750 Dim JoinBuffer(0 To 2 ) As String
709751 Dim LB1 As Long , UB1 As Long
710752 Dim LB2 As Long , UB2 As Long
753+ Dim TwoDimensional As Boolean
711754
712755 On Error GoTo JoinRecordsFields_Error
713- LB1 = LBound(RecordsArray, 1 )
714- LB2 = LBound(RecordsArray, 2 )
715- UB1 = UBound(RecordsArray, 1 )
716- UB2 = UBound(RecordsArray, 2 )
756+ If MultiDimensional(RecordsArray) Then
757+ TwoDimensional = True
758+ LB1 = LBound(RecordsArray, 1 )
759+ LB2 = LBound(RecordsArray, 2 )
760+ UB1 = UBound(RecordsArray, 1 )
761+ UB2 = UBound(RecordsArray, 2 )
762+ Else
763+ TwoDimensional = False
764+ LB1 = LBound(RecordsArray, 1 )
765+ UB1 = UBound(RecordsArray, 1 )
766+ End If
717767 '@----------------------------------------------------------------------------
718768 Select Case P_QUOTING_MODE
719769 Case QuotationMode.Critical
@@ -732,39 +782,71 @@ Attribute JoinRecordsFields.VB_Description = "Joins all fields for each record i
732782 JoinBuffer(0 ) = CoerceChr
733783 JoinBuffer(1 ) = vbNullString
734784 JoinBuffer(2 ) = CoerceChr
735- '@----------------------------------------------------------------------------
736- 'Set array sizes
737- ReDim ConcatenatedArray(LB1 To UB1)
738- ReDim buffer(LB2 To UB2)
739- '@----------------------------------------------------------------------------
740- 'Concatenate fields
741- For iLCounter = LB1 To UB1
742- For jLCounter = LB2 To UB2
743- If InStrB(1 , RecordsArray(iLCounter, jLCounter), P_FIELDS_DELIMITER) Then
744- JoinBuffer(1 ) = RecordsArray(iLCounter, jLCounter)
745- buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
746- ElseIf InStrB(1 , RecordsArray(iLCounter, jLCounter), CoerceChr) Then
747- JoinBuffer(1 ) = RecordsArray(iLCounter, jLCounter)
748- buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
749- ElseIf InStrB(1 , RecordsArray(iLCounter, jLCounter), P_RECORDS_DELIMITER) Then
750- JoinBuffer(1 ) = RecordsArray(iLCounter, jLCounter)
751- buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
785+ If TwoDimensional Then
786+ '@----------------------------------------------------------------------------
787+ 'Set array sizes
788+ ReDim ConcatenatedArray(LB1 To UB1)
789+ ReDim buffer(LB2 To UB2)
790+ '@----------------------------------------------------------------------------
791+ 'Concatenate fields
792+ For iLCounter = LB1 To UB1
793+ For jLCounter = LB2 To UB2
794+ If InStrB(1 , RecordsArray(iLCounter, jLCounter), P_FIELDS_DELIMITER) Then
795+ JoinBuffer(1 ) = RecordsArray(iLCounter, jLCounter)
796+ buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
797+ ElseIf InStrB(1 , RecordsArray(iLCounter, jLCounter), CoerceChr) Then
798+ JoinBuffer(1 ) = RecordsArray(iLCounter, jLCounter)
799+ buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
800+ ElseIf InStrB(1 , RecordsArray(iLCounter, jLCounter), P_RECORDS_DELIMITER) Then
801+ JoinBuffer(1 ) = RecordsArray(iLCounter, jLCounter)
802+ buffer(jLCounter) = Join$(JoinBuffer, vbNullString)
803+ Else
804+ buffer(jLCounter) = RecordsArray(iLCounter, jLCounter)
805+ End If
806+ JoinBuffer(1 ) = vbNullString
807+ Next jLCounter
808+ ConcatenatedArray(iLCounter) = Join$(buffer, P_FIELDS_DELIMITER)
809+ Next iLCounter
810+ '@----------------------------------------------------------------------------
811+ 'Concatenate records
812+ JoinRecordsFields = Join$(ConcatenatedArray, P_RECORDS_DELIMITER)
813+ '@----------------------------------------------------------------------------
814+ 'Free the memory
815+ Erase ConcatenatedArray
816+ Erase buffer
817+ Else
818+ '@----------------------------------------------------------------------------
819+ 'Set array sizes
820+ ReDim ConcatenatedArray(LB1 To UB1)
821+ ReDim buffer(0 )
822+ '@----------------------------------------------------------------------------
823+ 'Concatenate fields
824+ For iLCounter = LB1 To UB1
825+ If InStrB(1 , RecordsArray(iLCounter), P_FIELDS_DELIMITER) Then
826+ JoinBuffer(1 ) = RecordsArray(iLCounter)
827+ buffer(0 ) = Join$(JoinBuffer, vbNullString)
828+ ElseIf InStrB(1 , RecordsArray(iLCounter), CoerceChr) Then
829+ JoinBuffer(1 ) = RecordsArray(iLCounter)
830+ buffer(0 ) = Join$(JoinBuffer, vbNullString)
831+ ElseIf InStrB(1 , RecordsArray(iLCounter), P_RECORDS_DELIMITER) Then
832+ JoinBuffer(1 ) = RecordsArray(iLCounter)
833+ buffer(0 ) = Join$(JoinBuffer, vbNullString)
752834 Else
753- buffer(jLCounter ) = RecordsArray(iLCounter, jLCounter )
835+ buffer(0 ) = RecordsArray(iLCounter)
754836 End If
755837 JoinBuffer(1 ) = vbNullString
756- Next jLCounter
757- ConcatenatedArray(iLCounter) = Join$(buffer, P_FIELDS_DELIMITER)
758- Next iLCounter
759- '@----------------------------------------------------------------------------
760- 'Concatenate records
761- JoinRecordsFields = Join$(ConcatenatedArray, P_RECORDS_DELIMITER)
762- '@----------------------------------------------------------------------------
763- 'Free the memory
764- Erase ConcatenatedArray
765- Erase buffer
838+ ConcatenatedArray(iLCounter) = buffer( 0 )
839+ Next iLCounter
840+ '@----------------------------------------------------------------------------
841+ 'Concatenate records
842+ JoinRecordsFields = Join$(ConcatenatedArray, P_RECORDS_DELIMITER)
843+ '@----------------------------------------------------------------------------
844+ 'Free the memory
845+ Erase ConcatenatedArray
846+ Erase buffer
847+ End If
766848 Case Else
767- If MultiDimensional(RecordsArray) Then
849+ If TwoDimensional Then
768850 '@----------------------------------------------------------------------------
769851 'Set delimiters
770852 Select Case P_ESCAPE_CHAR
@@ -858,7 +940,7 @@ Private Sub ParseCriticalCSV(ByRef csvText As String, _
858940 Optional HeadersOmission As Boolean = False )
859941 Dim ASCIIcharw As Long
860942 Dim buffer() As String
861- Dim Counter1 As Long , Counter2 As Long
943+ Dim Counter1 As Long
862944 Dim CurrentBufferIndex As Long
863945 Dim CurrentRecordSize As Long
864946 Dim CurrenttmpTokenIndex As Long
@@ -885,7 +967,6 @@ Private Sub ParseCriticalCSV(ByRef csvText As String, _
885967 Dim SplittedToken As Boolean
886968 Dim StartRecord As Long
887969 Dim tmpCSV() As String
888- Dim tmpOutputArray() As String
889970 Dim tmpToken() As String
890971 Dim TokenBeginningPos As Long
891972 Dim TokenEndingPos As Long
@@ -1336,22 +1417,18 @@ Private Sub ParseCriticalCSV(ByRef csvText As String, _
13361417 SkipUnwantedLines index, MaxIndex, tmpCSV
13371418 If index <= MaxIndex Then LenCurrentIndex = LenB(tmpCSV(index))
13381419 Loop
1339- If ImportDepth <> RecordsCount Then 'There are empty index in the array
1340- ReDim tmpOutputArray(0 To RecordsCount - 1 , 0 To FieldsAmount - 1 )
1341- For Counter1 = 0 To RecordsCount - 1
1342- For Counter2 = 0 To FieldsAmount - 1
1343- tmpOutputArray(Counter1, Counter2) = P_CSV_DATA(Counter1, Counter2)
1344- P_CSV_DATA(Counter1, Counter2) = vbNullString 'Release memory
1345- Next Counter2
1346- Next Counter1
1347- Erase P_CSV_DATA
1348- P_CSV_DATA() = tmpOutputArray()
1349- Erase tmpOutputArray
1420+ '@----------------------------------------------------------------------------
1421+ 'Check if the array need to be shrinked at the output stage
1422+ If ImportDepth <> RecordsCount Then
1423+ P_NEED_SHRINK = True
1424+ P_OUTPUT_UB1 = RecordsCount - 1
1425+ P_OUTPUT_UB2 = FieldsAmount - 1
1426+ Else
1427+ P_NEED_SHRINK = False
13501428 End If
13511429 Erase tmpCSV
13521430 Exit Sub
13531431ParseCriticalCSV_Error_Handler:
1354- Erase tmpOutputArray
13551432 Erase P_CSV_DATA
13561433 Erase tmpCSV
13571434 P_ERROR_NUMBER = Err.number
0 commit comments