Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi CSV via ADO einlesen (https://www.delphipraxis.net/136362-csv-via-ado-einlesen.html)

Stormy 29. Jun 2009 11:36

Datenbank: ODBC • Zugriff über: ADO

CSV via ADO einlesen
 
Hallo,

habe gerade eine Problem mit dem einlesen einer CSV Datei.
Mein ConnectionString=Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=_File;Extensions=asc,csv,tab,txt;
Das funktioniert auch soweit schonman gut. Das Problem ist das wenn ich via GetFieldNames die Feldnamen der Tabelle (CSV)
ausgebe ich nur das erste Feld (Artikelnummer) erhalte. In Wirklichkeit sind es aber über 10 Felder die in der ersten Zeile der
CSV definiert sind. Gibt es eine ADO-Option welche ich mit dem ConnectionString übergebe die sagt das die ganze erste Zeile
in der CSV die Tabellennamen enthält? Oder muss ich das irgendwie anders definieren? Ich habe es schon mit HDR=Yes bzw No versucht
bzw. den ConnectionString=Provider=Microsoft.Jet.OLEDB.4.0; Data Source=_Filename;Extended Properties=text;HDR=Yes;FMT=Delimited; getestet aber bekomme dann immer die Fehlermeldung "Nicht erkennbares Datenbankformat" oder "Installierbares ISAM nicht gefunden"
nicht gefunden. Aber eigentlich müsste der richtige Weg ja der über den MS Text Driver sein wie oben erwähnt.

Ich hoffe jemand versteht mein Problem und kann mir helfen.

Danke im Voraus!


Gruß
Stormy

Stormy 29. Jun 2009 13:56

Re: CSV via ADO einlesen
 
Was ich vergessen habe - meine Schema.ini die sich im selben Verzeichniss befindet wie die CSV ist folgendermaßen aufgebaut:

[artikelfull.csv]
Format=Delimited(,)
TextDelimiter="
ColNameHeader=True
MaxScanRows=0
CharacterSet=OEM

Laut MSDN sollte ColNameHeader dafür zuständig sein das die erste Zeile in der CSV die Spaltennamen enthält.
Aber warum bekomme ich nur die erste Spalte (Artikelnummer) ausgegeben wenn die erste Zeile doch noch 8 weitere Felder enthält?

Ich bin Ratlosund wäre für Hilfe dankbar!


Gruß
Stormy

Morphie 29. Jun 2009 13:58

Re: CSV via ADO einlesen
 
wie sieht denn deine CSV-Datei aus?

Stormy 29. Jun 2009 14:18

Re: CSV via ADO einlesen
 
Hi,

also um mal die ersten beiden Zeilen zu zeigen:

1.Zeile
"Artikelnummer","Beschreibung","Modul","Artikelhau ptgruppe","Artikeluntergruppe","Verkaufsgarantieco de","Verfügbar Distribution","VK-Preis","Herstellercode","Herstellername","Referenz nummer","Textbaustein","Auslauf","S","EAN-Code","Dateiname","UVP (brutto)","Verfügbarer Bestand CP","Nächste Verfügbarkeit CP","Nächste Verfügbare Menge CP","artikeltext_plain","artikeltext_html","Brutto gewicht","Artikelkurzbeschreibung","artikeltext_dr uck"

2.Zeile...
"1000899","TERRA PC-BUSINESS 5000 iE8400 VB>XPP","PC TERRA","PC-BUSINES","","G36","0","449","WMT","WMT AG","1000899","Ja","Nein","","4039407008209","B100 7666.JPG","619","0","24.09.2008","100+"...usw. usf.

Ich habe jetzt mal in der ersten Zeile die Kommata (,) gegen Semikomata (;) ausgetauscht und siehe da es geht!
Aber leider habe ich keine Lust jedes mal die erste Zeile manuell zu ändern.
Wenn ich es mit dem Kommata versuche also auch in der Schema.ini Format=CSVDelimited setze dann erhalte ich den Fehler:
[Microsoft][ODBC Text Driver] Das Feldtrennzeichen für die angegebene Textdatei entspricht dem Dezimaltrennzeichen oder Texttrennzeichen.

Warum kann das Trennzeichen in der ersten Zeile nicht gleich dem Trennzeichen der folgenden Zeilen sein?
Ich sage doch explizit mit ColNameHeader=True das die erste Zeile die Feldnamen enthält also sollte er doch auch
ein Komma als Trennzeichen akzeptieren? Oder habe ich etwas vergessen?


Gruß
Stormy

Stormy 29. Jun 2009 14:30

Re: CSV via ADO einlesen
 
Problem gelöst!
Man muss in die Schema.ini wenn die Werte durch Kommata getrennt sind noch einen zusätzlichen parameter setzen und zwar DecimalSymbol=."
Keine Ahnung wer sich das ausgedacht hat jedenfalls steht in der MSDN nichts davon. Habe den entsprechenden Tipp dafür eben von einem Kollegen bekommen.


Gruß
Stormy

p80286 29. Jun 2009 15:11

Re: CSV via ADO einlesen
 
Hallo Stormy,

so wie Deine Daten aufgebaut sind (alle Feldinhalte mit " eingeschlossen), sollte es wirklich egal sein. aber da auch so etwas möglich ist
Delphi-Quellcode:
..; 123,456 ; ...
sollte man alles definieren was möglich ist, sonst bekommt man ein Problem.

(Über die MS-Logik wollen wir jetzt mal nicht diskutieren hier lesen)

Gruß
K-H

Stormy 29. Jun 2009 15:16

Re: CSV via ADO einlesen
 
Ja da hast du wohl Recht nur sollte es bei Quoted Strings egal sein was dazwischen steht.
Genau die selbe Seite der MSDN habe ich auch schon Studiert.
Doch dort steht nur spärlich etwas über den Parameter "DecimalSymbol".
Naja jetzt läuft es endlich. :)


Gruß
Stormy

Stormy 6. Jul 2009 21:42

Re: CSV via ADO einlesen
 
Abend zusammen,

habe noch ein Problem was die gleiche Sache betrifft und wollte daher
keinen neuen Thread auf machen.

Ich habe also eine CSV-Datei in dieser es auch Felder gibt welche mehr als
255 Zeichen enthalten. Also Artikelbeschreibungen welche gut und gerne mal 500-800 Zeichen lang sind.

Jetzt lese ich diese CSV via MS Text Driver in eine TADOTable ein was problemlos funktioniert.
Will ich aber jetzt die Datensätze wieder auslesen bekomme ich nur maximal 255 Zeichen lange
Strings zurück. Sprich alles was länger als 255 Zeichen war wird abgeschnitten.

Jetzt ist meine Frage: Wer ist der Übeltäter? Liegt es an der ADO-Komponente, an ODBC bzw. dem
MS Text Driver oder gar an etwas ganz anderem? An SQL kann es ja denke ich mal nicht liegen.
Hat vllt. etwas mit den Datentypen zu tun? Delphi Strings unterstützen ja bis zu ~2^31 Zeichen
aber wie ist das bei MS? Könnte es schon am MS Text Driver liegen der nur 255er Strings einließt?
Was gibt es für Alternativen bzw. Lösungen?

Danke schonmal im Voraus.


Gruß
Stormy

Stormy 7. Jul 2009 09:35

Re: CSV via ADO einlesen
 
Ok, Problem gelöst!
Nach abermaligen lesen der Doku kam ich zu dem Schluss des es an der Schema.ini lag.


Gruß
Stormy


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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