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 4 von 4   « Erste     234   
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Re: CSV-Reader. Schnelles lesen von CSV-Dateien

  Alt 10. Aug 2009, 08:38
Hallo Jan,
Das von Dir beschriebene Datenformat (konstante Spaltenbreite) sind nicht nur keine CSV-Datei "im eigentlichen Sinne", sondern überhaupt nicht.

Um Daten mit konstanter Spaltenbreite zu importieren, sollte sich ein anderer Reader implementieren lassen, der dies wesentlich eleganter und vor allem performanter lösen kann: Er benötigt ja nur die Spaltenbreite, den linken Abstand sowie optional ein Füllzeichen. So ein Reader funktioniert intern völlig anders als ein CSV-Reader, wieso sollte man also einen CSV-Reader dafür 'aufwerten' (ich würde das eher 'verwässern' nennen)? Eine Klasse sollte genau einem Zweck dienen (hier: Lesen von CSV-Dateien).

Zudem sollte man Klassen auch nicht mit Eigenschaften ausstatten, deren Funktionalität sich mit wenigen Aufrufen der Elementaroperationen selbst nachbilden lässt:

Nur leere Zellen am Anfang der Zeile ignorieren:
Delphi-Quellcode:
Var
  bAtBeginningOfLine : Boolean;
  iRealColumn : Integer;
  sCellData : String;
...
csvReader.First;
While not csvReader.Eof Do Begin
  bAtBeginningOfLine := True;
  iRealColumn := 0;
  For i := 0 to csvReader.ColumnCount - 1 Do Begin
    sCellData := csvReader.Columns[i];
    If bAtBeginningOfLine And (sCellData = '') Then Continue;
    bAtBeginningOfLine := False;
    inc (iRealColumn); // Die 'Spaltennummer' ohne leere Zellen am Anfang
    Memo.Lines.Add (sCellData);
  End;
  csvReader.Next;
End;
Leere Zellen ignorieren:
Delphi-Quellcode:
Var
  iRealColumn : Integer;
  sCellData : String;

...
csvReader.First;
While not csvReader.Eof Do Begin
  iRealColumn := 0;
  For i := 0 to csvReader.ColumnCount - 1 Do Begin
    sCellData := csvReader.Columns[i];
    If sCellData = 'Then Continue;
    inc (iRealColumn); // Die 'Spaltennummer'
    Memo.Lines.Add (sCellData);
  End;
  csvReader.Next;
End;
Die OOP-konforme Vorgehensweise hier (für Dich) wäre so:
1. Definieren einer abstrakten Basisklasse ("TableReader"), die die elementaren Operationen zum Lesen von Daten aus Dateien bereitstellt (First, ColumnCount, Next, Eof, Columns).
2. Umschreiben der Klasse CSV-Reader als Nachfolger des "TableReader".
3. Implementieren der Klasse "Constant-Column Reader" als Nachfolger des "TableReader".

Du kannst nun auch weitere 'TableReader' implementieren, z.B. die eine SYLK-Datei einlesen, oder direkt mit BIFF arbeiten, oder XML, JSON etc. Der Vorteil ist, das Du diverse schlanke, wartbare und performante Klassen hast, die ohne Probleme erweiterbar und optimierbar sind. Bei einer eierlegenden Wollmilchsauklasse ("God Class") ist dies nicht der Fall.

Gruß zurück.
  Mit Zitat antworten Zitat
Triple Crown

Registriert seit: 5. Sep 2011
1 Beiträge
 
#2

AW: CSV-Reader. Schnelles lesen von CSV-Dateien

  Alt 7. Sep 2011, 14:25
Hallo!

Vielen Dank für die Unit!!!

Hat bei mir mit
WIN 7 /Lazarus 0.9.30/ FPC 2.4.2
geklappt.

Gruß!
Andreas
  Mit Zitat antworten Zitat
Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#3

AW: CSV-Reader. Schnelles lesen von CSV-Dateien

  Alt 29. Aug 2012, 13:49
Hi,

funktioniert super! Danke! Selbst große Datenmenge packt der Reader in kürzester Zeit!

LG
  Mit Zitat antworten Zitat
Benutzerbild von divBy0
divBy0

Registriert seit: 4. Mär 2007
Ort: Sponheim
1.021 Beiträge
 
Delphi XE2 Professional
 
#4

AW: CSV-Reader. Schnelles lesen von CSV-Dateien

  Alt 17. Jan 2013, 14:49
Hallo,
ich stehe gerade auf dem Schlauch. Die CSV-Datei ist ANSI-kodiert und wird unter XE2 als asiatischer Schriftzeichensalat gelesen.
Hab die Datei schon mit TEncoding nach Unicode, UTF8 und UTF16 konvertiert, bringt mich aber alles nicht weiter.

Kann mich mal bitte jemand in die richtige Richtung schubsen?
Marc
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt, die 10. summt die Melodie von Tetris... | Wenn das die Lösung ist, dann hätte ich gerne mein Problem zurück! | engbarth.es
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: CSV-Reader. Schnelles lesen von CSV-Dateien

  Alt 17. Jan 2013, 15:57
Ich hab die Sourcen gerade nicht zur Hand, aber das hört sich an als ob eine Unterscheidung String/Ansistring fällig wäre.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
roadrunner-S51

Registriert seit: 28. Mai 2010
53 Beiträge
 
Delphi 2009 Professional
 
#6

AW: CSV-Reader. Schnelles lesen von CSV-Dateien

  Alt 3. Jul 2014, 11:05
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...
  Mit Zitat antworten Zitat
dynamo

Registriert seit: 21. Okt 2008
Ort: Bordesholm
37 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: CSV-Reader. Schnelles lesen von CSV-Dateien

  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
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 17:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz