Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Kleine Helferlein

CSV-Dateien erzeugen und lesen

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.MitgliedLothar 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 BefehlsreferenzeintragWRITE (Datei)BefehlsreferenzeintragINPUT (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 MitgliedLothar Schirm angelegt.
  • Die aktuellste Version wurde am 19.05.2011 von MitgliedLothar Schirm gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen