![]() |
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 |
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 |
Re: CSV via ADO einlesen
wie sieht denn deine CSV-Datei aus?
|
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 |
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 |
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:
sollte man alles definieren was möglich ist, sonst bekommt man ein Problem.
..; 123,456 ; ...
(Über die MS-Logik wollen wir jetzt mal nicht diskutieren ![]() Gruß K-H |
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 |
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 |
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 20:02 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