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 5 von 5   « Erste     345
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, 2042x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
 
Benutzerbild von Sherlock
Sherlock

 
Delphi 11 Alexandria
 
#41
  Alt 3. Jul 2014, 13:47
Gnah, in der Tat! Hab doch echt beim groben drüberfliegen ... aus großer Höhe... die 1en und 2en weitestgehend übersehen und mich am PChar festgebissen. Insofern ist es sogar vermutlich recht elegant lösbar.

Sherlock
Oliver
  Mit Zitat antworten Zitat
roadrunner-S51

 
Delphi 2009 Professional
 
#42
  Alt 3. Jul 2014, 13:48
Vielen Dank erstmal!
Ich habe nun alle PChar durch PAnsiChar ersetzt, ebenso die Char und Strings. Nun kann ich statt der viereckigen Kästschen schonmal etwas sinnvollere Werte einlesen.

Das einzige was ich noch nicht ganz verstehe ist, dass beim allerersten Element das ich aus der csv-Datei auslese, die letzten beiden Zeichen fehlen. Also z.B.

Aufbau csv-Datei:
10a2034;3269400;1;3;70;04.07.2013;3;2;70;04.07.201 3;6;2;70;04.07.2013;8;2
10a2075;3138127;2;2;70;05.06.2013;12;2;70;11.06.20 13;303;2;0;01.01.1970;0;0
10a2015;3107207;3;3;70;13.06.2013;25;2;70;13.06.20 13;70;2;70;13.06.2013;149;2
10a2058;3127735;4;3;70;08.05.2013;143;2;70;08.05.2 013;147;2;70;17.05.2013;26;2
10a2058;3127735;5;3;70;05.06.2013;20;2;70;05.06.20 13;28;2;70;05.06.2013;177;2
10a2017;3328115;6;3;70;27.06.2013;58;2;70;27.06.20 13;68;2;70;27.06.2013;76;2


Inhalt des ersten gelesenen Elements: 10a20

Alle weiteren Zeilen werden korrekt eingelesen. Hat jemand eine Idee woran das liegt?

OK, hat sich erledigt. Die Zeichen sind der BOM. Hatte vorher noch nie damit zu tun... Werde ich einfach aus dem String entfernen und gut ist.

Vielen Dank für eure Hilfe!

Geändert von roadrunner-S51 ( 3. Jul 2014 um 15:19 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
 
#43
  Alt 3. Jul 2014, 17:23
Das, was Du da einliest, ist der BOM. Das ist so bei Unicode Dateien.
  Mit Zitat antworten Zitat
HPB

 
Delphi XE7 Professional
 
#44
  Alt 6. Okt 2015, 15:22
Sorry das ich das alte Thema nochmal ausgrabe, aber ich habe das selbe Problem mit den Unicodeformat und hätte gern gewusst, ob mittlerweile eine Lösung existiert...
Guten Tag Delphianer,
auch ich habe das oben geschilderte Problem. Alles nur China-Zeichen.
Weiter unter wird gesagt, dass etwas geändert werden muss.
Aber nur was soll konkret in welcher Zeile geändert werden???
Es wäre nett wenn jemand konkret mitteilt, was in welcher Zeile des
Quellcodes geändert werden muss.
Mit Gruß
HPB
  Mit Zitat antworten Zitat
HPB

 
Delphi XE7 Professional
 
#45
  Alt 6. Okt 2015, 16:02
Sorry das ich das alte Thema nochmal ausgrabe, aber ich habe das selbe Problem mit den Unicodeformat und hätte gern gewusst, ob mittlerweile eine Lösung existiert...
Guten Tag Delphianer,
auch ich habe das oben geschilderte Problem. Alles nur China-Zeichen.
....
Mit Gruß
HPB
Bitte alles Vergessen. Es ist der falsche Post.
Mea Culpa.
Mit Gruß HPB
  Mit Zitat antworten Zitat
HPB

 
Delphi XE7 Professional
 
#46
  Alt 6. Okt 2015, 16:10
Guten Tag Delphianer,
ich habe beim Einlesen der Daten auch nur China-Zeichen.
Wie "divBy0" auch.
Kann jemand genau erklären, was, in welcher Zeile, geändert werden soll,
damit die Daten korrekt eingelsen werden??
Die Unit ist ja rasend schnell und ich würde sie gerne benutzen.
Mit Gruß
HPB
  Mit Zitat antworten Zitat
Dejan Vu
 
#47
  Alt 7. Okt 2015, 07:40
Das Problem ist hier, das mit Pointerarithmetik gearbeitet wird, d.h. aus dem Abstand zweier PChar wird auf eine Länge geschlossen. Du solltest den Debugger verwenden, um den Code zu verstehen und dann die Zeilen entsprechend anpassen.

Im Code steht ja drin, das er so banal ist, das ein Copyright nicht lohnt.
  Mit Zitat antworten Zitat
DelTurbo

 
Delphi 2007 Architect
 
#48
  Alt 21. Jun 2017, 13:51
Hi,
erst mal möchte ich sagen das es wirklich wirklich schnell ist. Allerdings ist mir eine Kleinigkeit aufgefallen und ich dachte bevor andere auch suchen, Poste ich es gerade.

Beim Create wird fEOLChar := #13; gesetzt. Allerdings fEOLLength auf zwei. Dann fehlt immer das erste Zeichen von der ersten Spalte.

Gruß
  Mit Zitat antworten Zitat
dynamo

 
Delphi 11 Alexandria
 
#49
  Alt 28. Nov 2017, 20:26
Auch wenn's schon etwas spät kommt: CSV_IM_Export.zip
Mit diesem Demo (MySQL-Table -> CSV) und (CSV -> MySQL-Table) sollte es klappen - Das Demoprogramm behandelt CSV-Formate mit Texttrenner, Feldtrenner, Zeilenumbrüche, auch wenn diese Zeichen im Text selbst vorkommen.
Es kann leicht an individuelle Bedürfnisse angepasst werden.
Jörg
  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 19:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz