CSV Reader/Writer

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

Shaman

Betreff: CSV Reader/Writer

BeitragDo, Aug 11, 2011 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese kleinen Funktionen schreiben oder lesen CSV-Dateien.
Diese "Komma getrennten Datendateien" stellen Tabellen dar.

Beispiel für eine solche Tabelle:
Code: [AUSKLAPPEN]

a1;b1;c1;d1
a2;b2;c2;d2
a3;b3;c3;d3

Dies ist eine Tabelle mit 4 Spalten (a-d) und 3 Zeilen (1-3).

CSV-Dateien können von z.B. Exel und Calc exportiert werden.

Der Seperator (Trennrt zwischen den Zellen) kann angegeben werden
Exel benutzt immer ";" , bei Calc kann man zwischen ";" und "," auswählen
(ohne Anführungszeichen natürlich)

jetzt der Code zum Lesen von CSV-Dateien:
Code: [AUSKLAPPEN]

Rem
bbdoc: Ließt eine CSV-Datei
about: url kann ein String sein, dann wird eine Datei geladen/erstellt; <br>
   oder ein Stream, dann wird direkt in diesen Stream geschrieben. <br>
   arrayWidth und arrayHeight werden aus der Datei/Stream gelesen <br>
   arrayWidth: Breite der Tabelle (Spaltenanzahl) <br>
   arrayHeight: Höhe der Tabelle (Zeilenanzahl). <br>
   der Seperator ist normalerweise ein Semikolon (;) oder Komma (,).
EndRem
Function ReadCSV:String[,](url:Object,arrayWidth:Int Var,arrayHeight:Int Var,seperator:String=";")
   Local file:TStream
   Local name:String
   'DebugStop
   If TStream(url)=Null Then
      name=String(url)   
      file=ReadFile(name)
   Else
      file=TStream(url)
   EndIf
   If file=Null Then Print("No file found"); Return Null
   
   
   Local lineCount:Int=0
   Local lines:String[1]
   Local line:String
   
   While(Eof(file)=0)
      line=file.ReadLine()
      If line="" Then Exit
      lineCount:+1
      lines=lines[..lineCount]
      lines[lineCount-1]=line
   Wend
   If lineCount=0 Then Return Null
   
   arrayHeight=lineCount
   arrayWidth=lines[0].Split(seperator).length
   
   Local array:String[arrayHeight,arrayWidth]
   Local x:Int
   Local y:Int
   Local splitted:String[]
   For x=0 Until lineCount
      line=lines[x]
      splitted=line.Split(seperator)
      For y=0 Until splitted.length
         array[x,y]=splitted[y]
      Next
   Next
   If TStream(url)=Null Then CloseFile(file)
   
   Return array
End Function


und passend dazu zum schreiben:
Code: [AUSKLAPPEN]

Rem
bbdoc: Schreibt eine CSV-Datei
about: url kann ein String sein, dann wird eine Datei geladen/erstellt; <br>
   oder ein Stream, dann wird direkt in diesen Stream geschrieben. <br>
   Dass Source-Array sollte zuvor mit ReadCSV gelesen worden sein. <br>
   arrayWidth und arrayHeight sind die Rückgabewerte von ReadCSV.
EndRem
Function WriteCSV:Int(url:Object,array:String[,],arrayWidth:Int,arrayHeight:Int,seperator:String=";")
   Local file:TStream
   If TStream(url)=Null Then
      file=WriteFile(String(url))
   Else
      file=TStream(url)
   EndIf
   If file=Null Then Print("Unable to write stream");Return 0
   
   Local x:Int
   Local y:Int
   Local line:String
   
   For x=0 Until arrayHeight
      line=""
      For y=0 To (arrayWidth-2)
         line=line+array[x,y]+seperator
      Next
      y=arrayWidth-1
      If y>=0 Then
         line=line+array[x,y]
      EndIf
      file.WriteLine(line)
   Next
   If TStream(url)=Null Then CloseFile(file)
   Return 1
End Function


kleines Beispiel:
Das geladene File kann z.B. die oben genannte Tabelle sein.
Code: [AUSKLAPPEN]

SuperStrict

Local w:Int
Local h:Int

Print "CSV Testprogramm"
Print ""

Local array:String[,]=ReadCSV("tabelle1.csv",w,h,";")
If array=Null Then RuntimeError("Error reading CSV")

Local x:Int
Local y:Int
Local line:String

Print "Ausgabe"
For y=0 Until h
   line=""
   For x=0 Until w
      line=line+array[y,x]+";"
   Next
   Print line
Next

Print "Write: "+WriteCSV("test1.csv",array,w,h)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group