AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte CSV-Reader. Schnelles lesen von CSV-Dateien

CSV-Reader. Schnelles lesen von CSV-Dateien

Ein Thema von alzaimar · begonnen am 11. Mär 2008 · letzter Beitrag vom 28. Nov 2017
Antwort Antwort
Seite 1 von 5  1 23     Letzte » 
alzaimar
Registriert seit: 6. Mai 2005
Hallo,

Ich habe mal eine Klasse geschrieben, die CSV-Dateien einliest und die einzelnen Elemente extrahiert. Dabei werden auch in '"' eingeschlossenen Strings korrekt erkannt.

Verwendet wird es so:
Delphi-Quellcode:
Var
  csvReader : TCSVReader;
  sData : TFileStream;

Begin
  sData := TFileStream.Create('Sample.CSV',fmOpenRead);
  csvReader := TCSVReader.Create (sData, ';');
  csvReader.First; // Nach Änderung auf Veranlassung von Grenzgaenger nun notwendig. Dank an 'deadcandance'
  Try
    While not csvReader.Eof Do Begin
      For i:=0 to csvReader.ColumnCount - 1 Do
        Memo.Lines.Add (csvReader.Columns[i]);
      csvReader.Next;
    End;
  Finally
    csvReader.Free;
    sData.Free;
  End;
End;
Es ist ziemlich flott. Vielleicht kann Jemand etwas damit anfangen.

Bugreports und Verbesserungsvorschläge sind natürlich erwünscht.

Bug: Grenzgaenger hat mich auf einen Fehler in der Behandlung von '""' aufmerksam gemacht. Weiterhin wünschte er sich den Quote-Character als Eigenschaft. Bitte sehr.
Erweiterung: ralfschwalbe hätte gern, das die Klasse auch mit UNIX-Umbrüchen umgehen kann. Bitte sehr.
Erweiterung: Noch besser: Man kann nun das EOL-Zeichen und die Länge selbst angeben (z.B. für Unix #10 und 1, Windows: #13 und 2)
Änderung: Laut grenzgaenger hat der Aufruf von 'First' im Konstruktor nix zu suchen. Recht hat er!
Bug: Kater Karlo hat einen Fehler im Konstruktor entdeckt, der bei Streams auftritt, deren Position>0 ist. Weiterhin ist ein überflüssiges privates Feld entfernt worden.
Angehängte Dateien
Dateityp: pas cscsv_785.pas (6,8 KB, 1802x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
 
Benutzerbild von ralfschwalbe
ralfschwalbe

 
Delphi XE3 Professional
 
#2
  Alt 12. Mär 2008, 06:39
Hi,

super Sache!

Aber ein Hinweis aus eigener Erfahrung: Du solltest unbedingt noch bedenken, dass es auch csv-Dateien mit UNIX Zeilenumbrüchen gibt!

Nicht das irgendwann mal was "schiefgeht"!
Ralf Schwalbe
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#3
  Alt 12. Mär 2008, 08:55
Hi ralf,

UNIX-Zeilenumbrüche sind nur ein CR, richtig? Das sollte kein Problem sein. Neue Version oben
  Mit Zitat antworten Zitat
marabu
 
#4
  Alt 12. Mär 2008, 09:18
Hi alzaimar,

nimm LF - ist besser so.

Freundliche Grüße
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#5
  Alt 12. Mär 2008, 09:25
Hallo Marabu. Na gut, dann muss ich ja nochmal nachdenken
  Mit Zitat antworten Zitat
grenzgaenger
 
#6
  Alt 12. Mär 2008, 23:20
hallo alzheimer,

vielleicht solltest du von den optionen her MAC, Unix und DOS unterstützen ... die trennzeichen sind wie folgt #13, #10, #13#10... und für kümimüsis #10#13 , welche es eben verwechseln ...

grüsse
GG
  Mit Zitat antworten Zitat
Tyrael Y.

 
Delphi 2007 Professional
 
#7
  Alt 13. Mär 2008, 08:11
Ein CSV Feldtrennzeichen kann ',' oder ';' sein.
Verarbeitest du beides oder nur eins von beiden?

U.u. wäre es dann gut als property das Trennzeichen mit angeben zu können.
Levent Yildirim
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

 
Delphi 7 Enterprise
 
#8
  Alt 13. Mär 2008, 09:15
Schau Dir mal den constructor an:
Constructor TCSVReader.Create(aStream: TStream; aDelimiter: Char);
Zitat:
Ein CSV Feldtrennzeichen kann ',' oder ';' sein.
Stimmt eigentlich nicht. CSV-Trennzeichen ist NUR das Komma, (Comma Separated Values), alles andere hat man aus Praktikabilität erfunden. Ursprünglich war das Format nur für Zahlenkolonnen gedacht. Da die Amis nur den Punkt als Dezimaltrennzeichen verwenden, hat man dann eben das Komma als Delimiter benutzt.
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#9
  Alt 13. Mär 2008, 09:27
Zitat von Union:
Zitat:
Ein CSV Feldtrennzeichen kann ',' oder ';' sein.
Stimmt eigentlich nicht.
Doch. Das Trennzeichen ist der 'ListSeparator'. Und der ist in anglikanischen Ländern das Komma, bei uns das ';'. Und wenn Du pervers bist, dann kannst Du auch ein '@' nehmen. Einfach in den internationalen Einstellungen der Systemsteuerung setzen. Also macht das schon Sinn, das Trennzeichen vogeben zu können.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

 
Delphi 7 Enterprise
 
#10
  Alt 13. Mär 2008, 09:31
Naja, vielleicht machen das manche Programme so mit dem ListSeparator. Aber die ganze Geschichte steht hier. Sehr interessant übrigens, dass erst 2005 versucht wird, dieses Uralt-Format zu standardisieren.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf