kholm
Korg Regular
   
Registered: 2000-06-19
Posts: 714
Loc: Randers, Denmark
|
Mark,
Here is a clean KiX code example for reading the CSV-file into a 2D Array.
The errorchecking is not fully made, but the code is functioning. (KiX 4.20/4.21 RC2)
Sorry, I can't keep the Golf score under 100 lines
code:
Break On $RC = SetOption(Explicit,On) Dim $File,$CsvArr $File = @CurDir + '\csvtest.txt' $CsvArr = CsvArray($File) If @Error = 0 CsvShow($CsvArr) ; Display array on screen EndIf Return ; ********** Convert a CSV - file to 2D array ********** Function CsvArray($File) Dim $Rec,$Row,$NumFields,$Handle,$i $Handle = FreeFileHandle() If $Handle $RC = Open($Handle,$File) Else Exit 9 ; No free filehandles EndIf ; Read first record, and determine number of fields $Rec = ReadRec($Handle) If @Error Exit 1 ; File not found or empty EndIf $NumFields = UBound($Rec) ReDim $CsvArray[$NumFields,0] $Row = 0 For $i = 0 To $NumFields $CsvArray[$i,0] = $Rec[$i] Next ; Read the rest of records in the file Do $Rec = ReadRec(1) ; Read next record If Not @Error If UBound($Rec) <> $NumFields Exit 2 ; Error in CSV-file, wrong number of fields in a record EndIf $Row = $Row + 1 ReDim Preserve $CsvArray[$NumFields,$Row] For $i = 0 To $NumFields $CsvArray[$i,$Row] = $Rec[$i] Next EndIf Until @Error $RC = Close($Handle) EndFunction ; Supportfunction for CsvArray() - Read a record from the CSV-file Function ReadRec($Handle) Dim $Line,$Tmp,$Start,$End,$i $Line = ReadLine($Handle) If @Error = 0 $Line = Join(Split($Line,'""'),Chr(1)) If InStr($Line,'"') While (UBound(Split($Line,'"')) & 1) And (@Error = 0) $Tmp = ReadLine($Handle) If @Error = 0 $Line = $Line + @CRLF + Join(Split($Tmp,'""'),Chr(1)) EndIf Loop EndIf $Start = Left($Line,1) = '"' $End = Right($Line,1) = '"' $Tmp = Split($Line,'"') $Line = '' For $i = $Start To Ubound($Tmp) - $End If $i & 1 $Tmp[$i] = '"' + Join(Split($Tmp[$i],','),Chr(2)) + '"' EndIf $Line = $Line + $Tmp[$i] Next $Tmp = Split($Line,',') For $i = 0 To Ubound($Tmp) $Tmp[$i] = Trim(Join(Split($Tmp[$i],Chr(1)),'""')) $Tmp[$i] = Join(Split($Tmp[$i],Chr(2)),',') Next $ReadRec = $Tmp Else Exit 1 EndIf EndFunction ; Testfunction for CsvArray() - Display the array Function CsvShow($CsvRec) Dim $i,$j For $i = 0 To UBound($CsvRec,2) For $j = 0 To UBound($CsvRec,1) 'Index: ' + $i + ',' $j ? $CsvRec[$j,$i] ? Next ? Next EndFunction
Testfile: csvtest.txt quote: John,Doe,120 jefferson st.,Riverside, NJ, 08075 "John ""Da Man""",Repici,"120, 121 Jefferson St.",Riverside, NJ,08075 Stephen,Tyler,"7452 Terrace ""At the Plaza"" road",SomeTown,SD, 91234 ,Blankman,,SomeTown, SD, 00298 "Joan ""the bone"", Anne",Jet,"9th, at Terrace plc",Desert City,CO,00123
-Erik
{Edit} Corrected missing DIM's [ 08. May 2003, 01:34: Message edited by: kholm ]
|