AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte CSV-Reader. Schnelles lesen von CSV-Dateien
Thema durchsuchen
Ansicht
Themen-Optionen

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 3 von 5     123 45      
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, 2063x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
 
alzaimar

 
Delphi 2007 Enterprise
 
#21
  Alt 22. Feb 2009, 21:38
Du müsstest die Unit noch einbinden ...
  Mit Zitat antworten Zitat
ekoplayer
 
#22
  Alt 23. Feb 2009, 06:57
also ich speicher die Datei csCSV.pas ab und dann erstelle ich ne neue Unit? und unter welchen Namen speicher ich die dann ab bzw. was muss ich daran noc ändern?
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#23
  Alt 23. Feb 2009, 07:21
Dir scheinen die Grundlagen der Programmierung mit Delphi/Pascal/ObjectPascal zu fehlen. Vielleicht wäre ein Crashkurs Delphi etwas für Dich. Danach kannst Du dir die Frage selbst beantworten. So würde das nichts werden.

Du kannst Dir auch die Beispiele anschauen, die bei Delphi dabei sind. Dort werden auch Units verwendet ("verwenden" englisch: 'to use' )
  Mit Zitat antworten Zitat
Der_Ventilator

 
Delphi 2010 Professional
 
#24
  Alt 7. Aug 2009, 09:42
Woran könnte es liegen, wenn ich statt des Inhalts der CSV nur rechteckige Kästchen einlesen kann?

Sowas (mit den Editor geöffnet)
Zitat:
132.187.93.175;255.255.255.0;448;8;0;0;005_MT_Schu l;;cache://global/deploy.shtml "HMZ_005_MT_Schul_2-1.ini";
wird im Memo nur als Kästchen angezeigt, hier im Forum mit japanischen Schriftzeichen.

Zitat:
灩摡牤渻瑥慭歳活摯汥漻瑰潩獮瀻數潭敤氻捯潫瑵朻潲灵愻瑵摨浯楡㭮瑳牡灴条㭥敲潳畬楴湯瀻慬晴牯㭭楦敬敳癲 牥昻汩獥牥敶扲歡爻浥瑯捥湯潳敬昻汩獥牥敶灲牯㭴敲潭整潣獮汯灥牯㭴敳楲污画極㭤睨摡牤猻慴畴㭳潭敤㭬慃档 卥穩㭥汃慥䍲捡敨湏散䌻牵敲瑮瑓瑡੥㌱⸲㠱⸷㌹ㄮ㔷㈻㔵㈮㔵㈮㔵〮㐻㠴㠻〻〻〻㔰䵟彔捓畨㭬挻捡敨⼺术潬慢 ⽬敤汰祯献瑨汭∠䵈彚〰張呍卟档汵㉟ㄭ椮楮㬢㈱〸ㅸ㈰㬴䅉㡸㬶⸰⸰⸰㬰⸰⸰⸰㬰⸰⸰⸰㬰㈭㈱㌳〻夻䍋こ㄰㐲 㬵䈰㘷䄷䔴㑁ㄴㄱ䍄㕂䘵〰㤱㤹㈰㐹㜶〻㄰㤹〹㤲㘴㬷协䈠住ⱔ传⁎䥄䭓䔻偓䥒位䌠㜵〲ㄻ〵〰昻污敳主坅䠠协੔ ㌱⸲㠱⸷㌹ㄮ㘷㈻㔵㈮㔵㈮㔵〮㐻㠴㠻〻〻〻㔰䵟彔捓畨㭬挻捡敨⼺术潬慢⽬敤汰祯献瑨汭∠䵈彚〰張呍卟档汵㉟ ㄭ椮楮㬢㈱〸ㅸ㈰㬴䅉㡸㬶⸰⸰⸰㬰⸰⸰⸰㬰⸰⸰⸰㬰㈭㈱㌳〻夻䍋こ㄰㐲㬲䕂䅂ㄴ䔹㑁㘴ㄱ䍄䘹
Verwendet mit BDS 2009

Das CSV wurde mit einem Webinterface erstellt und gespeicht, leider bekomme ich auch nur Kästchen, wenn ich mit Notepad eine test.csv erstelle und selbst mit Daten fülle.
  Mit Zitat antworten Zitat
franktron

 
Delphi 10.2 Tokyo Enterprise
 
#25
  Alt 7. Aug 2009, 10:34
Zitat von Der_Ventilator:
Woran könnte es liegen, wenn ich statt des Inhalts der CSV nur rechteckige Kästchen einlesen kann?

Sowas (mit den Editor geöffnet)
Zitat:
132.187.93.175;255.255.255.0;448;8;0;0;005_MT_Schu l;;cache://global/deploy.shtml "HMZ_005_MT_Schul_2-1.ini";
wird im Memo nur als Kästchen angezeigt, hier im Forum mit japanischen Schriftzeichen.

Zitat:
灩摡牤渻瑥慭歳活摯汥漻瑰潩獮瀻數潭敤氻捯潫瑵朻潲灵愻瑵摨浯楡㭮瑳牡灴条㭥敲潳畬楴湯瀻慬晴牯㭭楦敬敳癲 牥昻汩獥牥敶扲歡爻浥瑯捥湯潳敬昻汩獥牥敶灲牯㭴敲潭整潣獮汯灥牯㭴敳楲污画極㭤睨摡牤猻慴畴㭳潭敤㭬慃档 卥穩㭥汃慥䍲捡敨湏散䌻牵敲瑮瑓瑡੥㌱⸲㠱⸷㌹ㄮ㔷㈻㔵㈮㔵㈮㔵〮㐻㠴㠻〻〻〻㔰䵟彔捓畨㭬挻捡敨⼺术潬慢 ⽬敤汰祯献瑨汭∠䵈彚〰張呍卟档汵㉟ㄭ椮楮㬢㈱〸ㅸ㈰㬴䅉㡸㬶⸰⸰⸰㬰⸰⸰⸰㬰⸰⸰⸰㬰㈭㈱㌳〻夻䍋こ㄰㐲 㬵䈰㘷䄷䔴㑁ㄴㄱ䍄㕂䘵〰㤱㤹㈰㐹㜶〻㄰㤹〹㤲㘴㬷协䈠住ⱔ传⁎䥄䭓䔻偓䥒位䌠㜵〲ㄻ〵〰昻污敳主坅䠠协੔ ㌱⸲㠱⸷㌹ㄮ㘷㈻㔵㈮㔵㈮㔵〮㐻㠴㠻〻〻〻㔰䵟彔捓畨㭬挻捡敨⼺术潬慢⽬敤汰祯献瑨汭∠䵈彚〰張呍卟档汵㉟ ㄭ椮楮㬢㈱〸ㅸ㈰㬴䅉㡸㬶⸰⸰⸰㬰⸰⸰⸰㬰⸰⸰⸰㬰㈭㈱㌳〻夻䍋こ㄰㐲㬲䕂䅂ㄴ䔹㑁㘴ㄱ䍄䘹
Verwendet mit BDS 2009

Das CSV wurde mit einem Webinterface erstellt und gespeicht, leider bekomme ich auch nur Kästchen, wenn ich mit Notepad eine test.csv erstelle und selbst mit Daten fülle.
Das Zauberwort Heist Unicode
Frank
  Mit Zitat antworten Zitat
Der_Ventilator

 
Delphi 2010 Professional
 
#26
  Alt 7. Aug 2009, 12:17
Heist das, der normale Windowseditor speichert unter Windows XP im Unicodeformat, mit dem ein Memo nix anfangen kann?
  Mit Zitat antworten Zitat
franktron

 
Delphi 10.2 Tokyo Enterprise
 
#27
  Alt 7. Aug 2009, 13:07
Zitat von Der_Ventilator:
Heist das, der normale Windowseditor speichert unter Windows XP im Unicodeformat, mit dem ein Memo nix anfangen kann?
Neine D2009 scheint das aber zu meinen und liest es im Unicodeformat ein und dann kommt soein mist dabei raus
Frank
  Mit Zitat antworten Zitat
BoolString

 
RAD-Studio 2009 Pro
 
#28
  Alt 7. Aug 2009, 22:05
Sehr cool! Ich muss viel mit CSV Dateien arbeiten (wobei wir die inzwischen als Char-Separated-Values betiteln Ich hab inzwischen viele Routinen geschrieben, die immer leichte Varianten und Abweichungen prozessieren.

Was du vielleicht noch überarbeiten soltest wären:
- Property ab welcher Zeile die eigentlichen CSV Daten anfangen (häufig gibt es einen Header, der komplett anders aufgebaut ist und davor steht).
- eine Comment Property, die alle Zeilen enthält, die nicht als Daten eingelesen werden sollen (z.B. die Zeilen des Headers).
- Property für die Anzahl der Elemente pro Zeile (manchmal verrutschen Werte, wenn Messwerte nicht vorliegen, was zu Problemen führt, wenn man alles in eine Tabelle oder für weitere Berechnungen in eine Matrix schreibt).
- Für manche Anwendungen ist es interessant, bei der internen Verarbeitung die Delimiter am Anfang einer Zeile zu löschen.
- Für andere Anwendungen ist es interessant, mehrere aufeinanderfolgende Delimiter wie einen einzigen zu interpretieren.
- eine Möglichkeit eine Zeile anzugeben, welche Spaltenüberschriften trägt (diese sind häufig anders zu prozessieren als die darauffolgenden Daten); quasi die Column Headers.
- evtl. tatsächlich eine Option zur Unicode-Behandlung.


Bin ja echt gerade am Überlegen, ob ich meine Routinen nicht endlich mal auf eine schicke Klasse umschreiben sollte (man bastelt ja immer so seine Provisorien und die halten dann ewig). Dein Ansatz würde sich mit einigen Anpassungen sehr schön eignen!

Liebe Grüße aus ><)))°> Town

Jan
  Mit Zitat antworten Zitat
alzaimar

 
Delphi 2007 Enterprise
 
#29
  Alt 8. Aug 2009, 08:21
Hallo Jan,

Ich halte deine Vorschläge für nicht unbedingt sinnvoll, denn sie lassen sich bereits durch die vorhandenen Eigenschaften implementieren bzw. gehören imho nicht in die Klasse:
Du kannst zum Überspringen der ersten Zeilen die 'Next' Methode ein paar mal aufrufen. Weiterhin gibt dir die Eigenschaft 'ColumnCount' für jede Zeile die Anzahl der Zellen/Spalten zurück.
Die Prozessierung bzw. Behandlung des Inhaltes (=Interpretation) obliegt nicht der CSV-Klasse, sondern der benutzenden Anwendung. Die Darstellung als Matrix bzw. Dataset müsste diese Funktionalitäten bereitstellen: Hier geht es nur um das schnelle und korrekte Einlesen von Daten im CSV-Format.

Einzig die Unicode-Behandlung wäre eine Option. Wobei es dann sinnvoller wäre, eine neue Klasse dafür zu implementieren. So wie ich das sehe, müssten die String/Var/PChar-Variablendeklarationen durch ihre Unicode-Pendants ersetzt und an der Stelle 'GetMem' die Anzahl mit 2 multipliziert werden.
  Mit Zitat antworten Zitat
BoolString

 
RAD-Studio 2009 Pro
 
#30
  Alt 9. Aug 2009, 23:35
Ich habe mir deinen Code mal etwas genauer angesehen. Mit einigen Punkten hast du recht. Das lag wohl an meiner ersten, eher oberflächlichen, Inspektion Die Interpretation war natürlich nicht Teil meines Vorschlags. Das habe ich wohl etwas Missverständlich ausgedrückt. Ist klar, daß sich jede Anwendung die Daten dann in ihr eigenes Datenhandlingkonstrukt stopfen muss.

Bezüglich der 'Lösche Delimiter am Anfang' und 'Mehrere aufeinanderfolgende als einen Delimiter interpretieren' ermöglicht es gleichzeitig Datenfiles mit fester Spaltenbreite zu importieren. Hier werden ja die ungenutzten Zeichen meist mit Leerzeichen aufgefüllt. Durch die angesprochenen Properties könnte man die dann mit verarbeiten (Deli:=SPACE; LöscheAnfangsDelis:=True; MuliDeliAsOne:=True).
Ist aber nur ein Vorschlag; letztlich hast du natürlich recht, daß dies nicht CSV Dateien im eigentlichen Sinn sind. Es wäre aber eine Option diese gleich mit zu 'erschlagen' und sicherlich eine Aufwertung deines Codes. Ist ja aber nur ein Vorschlag; du hast ja danach gefragt

Liebe Grüße

Jan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 5     123 45      


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:19 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