Code-Beispiel
CSV-Dateien erzeugen und lesen
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | Lothar Schirm | 19.05.2011 |
Manchmal hat man mit FreeBASIC Daten erzeugt, die man in Excel weiterverarbeiten will, oder man will eine Excel-Tabelle mit FreeBASIC weiterverarbeiten. Im ersten Fall kann man die Daten in eine CSV-Datei schreiben und die Datei mit Excel öffnen. Im zweiten Fall kann man die Daten unter Excel im CSV-Format abspeichern und diese Daten dann mit FreeBASIC öffnen. CSV heißt "Comma Separeted Values", d.h. die Daten in einer Zeile sind durch Kommata voneinander getrennt. Solche Dateien lassen sich leicht mit WRITE #DateiNr. und INPUT #DateiNr. erzeugen und lesen, siehe Befehlsreferenz WRITE (Datei)INPUT (Datei). Bei der deutschen Version von Excel wird jedoch das Komma anstelle des Dezimalpunktes verwendet, so dass als Trennzeichen das Semikolon verwendet wird.
Das folgende kleine Programm arbeitet mit zwei SUbs. Die SUB WriteCSV speichert die Daten eines zweidimensionalen Arrays s(0, 0) bis s(m, n) in eine CSV-Datei (m+1 = Zeilenzahl, n+1 = Spaltenzahl). Hierbei kann statt des Semikolons auch jedes andere beliebige Trennzeichen gewählt werden (nicht für Excel!), und Dezimalpunkte können in Kommata verwandelt werden. Die SUB ReadCSV liest die Daten aus einer CSV-Datei in ein zweidimensionales Array ein, wobei die SUB die Zahl der Zeilen und Spalten selbst ermittelt und danach das Array dimensioniert.
'CSV.BAS - CSV-Dateien speichern und lesen
'------------------------- Hauptprogramm: -----------------------------------
DECLARE SUB WriteCSV(s() AS STRING, Datei AS STRING, convert AS INTEGER = 1, _
TZ AS STRING = ";")
DECLARE SUB SplitString(w AS STRING, z() AS STRING, BYREF k AS INTEGER, _
TZ AS STRING = ";")
DECLARE SUB ReadCSV(s() AS STRING, Datei AS STRING, convert AS INTEGER = 1, _
TZ AS STRING = ";")
DIM AS STRING s1(12, 2)
DIM AS STRING s2()
DIM AS INTEGER i, j, m, n
DIM AS SINGLE x, y, z
'Erzeugen einer CSV-Datei mit Semikolon als Trennzeichen und Kommata anstelle
'von Dezimalpunkten:
s1(0, 0) = "Wertetabelle y = SQR(x) und y = x^2"
s1(1, 0) = "x"
s1(1, 1) = "SQR(x)"
s1(1, 2) = "x^2"
FOR i = 2 TO 12
x = i - 2
y = SQR(x)
z = x^2
s1(i, 0) = STR(x)
s1(i, 1) = STR(y)
s1(i, 2) = STR(z)
NEXT i
WriteCSV(s1(), "test.csv")
'Diese Datei kann von EXCEL richtig gelesen werden!
'CSV-Datei lesen und anzeigen:
ReadCSV(s2(), "test.csv")
m = UBOUND(s2, 1)
n = UBOUND(s2, 2)
FOR i = 0 TO m
FOR j = 0 TO n
IF j < n THEN PRINT s2(i, j), ELSE PRINT s2(i, j)
NEXT j
NEXT i
SLEEP
'---------------------------------- SUBs: ------------------------------------
SUB WriteCSV(s() AS STRING, Datei AS STRING, convert AS INTEGER = 1, TZ AS STRING = ";")
' Erzeugt aus dem Array s(0, 0) bis s(m, n) eine CSV-Datei (Excel-kompatible
' Tabelle aus den Zeilen 0 bis m und den Spalten 0 bis n).
' Optionale Parameter:
' - convert <> 0: Dezimalpunkte werden in Kommata umgewandelt, wenn
' das Trennzeichen kein Komma ist (nur sinnvoll wenn keine sonstigen Daten
' mit Punkten enthalten sind, z.B. Datumsangaben)
' - TZ = Trennzeichen (z.B. Komma oder Semikolon oder beliebiges anderes Zeichen)
DIM AS INTEGER i, j, k, m, n, f
m = UBOUND(s, 1)
n = UBOUND(s, 2)
'Dezimalpunkte durch Kommata ersetzen:
IF convert <> 0 AND TZ <> "," THEN
FOR i = 0 TO m
FOR j = 0 TO n
k = INSTR(s(i, j), ".")
IF k > 0 THEN MID(s(i, j), k, 1) = ","
NEXT j
NEXT i
END IF
'Speichern mit Trennzeichen:
f = FREEFILE
OPEN Datei FOR OUTPUT AS #f
FOR i = 0 TO m
FOR j = 0 TO n - 1
PRINT #f, s(i, j) + TZ;
NEXT j
PRINT #f, s(i, n)
NEXT i
CLOSE #f
END SUB
SUB SplitString(w AS STRING, z() AS STRING, BYREF k AS INTEGER, TZ AS STRING = ";")
' Spaltet einen String w mit Trennzeichen TZ in Teilstrings z(0) bis z(k) auf
DIM AS INTEGER j
k = 0
z(k) = ""
FOR j = 1 TO LEN(w)
IF MID(w, j, 1) <> TZ THEN
z(k) = z(k) + MID(w, j, 1)
ELSEIF k < UBOUND(z) THEN
k = k + 1
z(k) = ""
ELSE
EXIT FOR
END IF
NEXT j
END SUB
SUB ReadCSV(s() AS STRING, Datei AS STRING, convert AS INTEGER = 1, TZ AS STRING = ";")
' Liest aus einer CSV-Datei die Elemente des zweidimensionalen Arrays s(0, n) bis
' s(m, n) (m + 1 Zeilen, n + 1 Spalten).
' Optionale Parameter:
' - convert <> 0: Dezimalkommata werden in Dezimalpunkte verwandelt (nur wenn TZ
' kein Komma ist)
' - TZ = Trennzeichen.
DIM AS INTEGER i, j, k, m, n, f, count
DIM AS STRING w
DIM AS STRING Hilf(), z()
'Datei zeilenweise auslesen und den String w jeder Zeile in ein eindimensionales
'Array Hilf eintragen, dabei Zahl der Zeilen ermitteln:
f = FREEFILE
OPEN Datei FOR INPUT AS #f
m = -1
DO
m = m + 1
LINE INPUT #f, w
REDIM PRESERVE Hilf(m)
Hilf(m) = w
LOOP UNTIL EOF(f)
CLOSE #f
'Anzahl der Spalten ermitteln durch bestimmen der maximalen Anzahl Trennzeichen
'pro Zeile:
n = 0
FOR i = 0 TO m
count = 0
FOR j = 1 TO LEN(Hilf(i))
IF MID(Hilf(i), j, 1) = TZ THEN count = count + 1
NEXT j
IF count > n THEN n = count
NEXT i
REDIM z(n)
'Falls convert <> 0 und TZ <> "," alle Kommata durch Dezimalpunkte ersetzen:
IF convert <> 0 AND TZ <> "," THEN
FOR i = 0 TO m
FOR j = 1 TO LEN(Hilf(i))
IF MID(Hilf(i), j, 1) = "," THEN MID(Hilf(i), j, 1) = "."
NEXT j
NEXT i
END IF
's(i, 0) bis s(i, n) auslesen:
REDIM s(m, n)
FOR i = 0 TO m
SplitString(Hilf(i), z(), k, TZ)
FOR j = 0 TO k
s(i, j) = z(j)
NEXT j
NEXT i
END SUB
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 12.03.2010 von Lothar Schirm angelegt.
- Die aktuellste Version wurde am 19.05.2011 von Lothar Schirm gespeichert.
|
|