Entwickler-Ecke
WinForms - Probleme beim Laden einer .csv-Datei
chillermiller - Sa 26.03.11 12:55
Titel: Probleme beim Laden einer .csv-Datei
Hallo liebe Community,
in meinem Programm arbeite ich mit einer Datentabelle(datatable), in die ich Werte einlese und dann in einer .csv-Datei abspeichere, was auch alles wunderbar funktioniert.
Beim Laden jedoch interpretiert er mir meine Zahlen als Datentyp "Datum", sodass ich bei der Weiterverarbeitung auf Probleme stoße.
Beim Laden des Programms(Form1_Load) werden sofort die Spalten gesetzt:
C#-Quelltext
1: 2: 3:
| dataTable.Columns.Add("Spalte1", typeof(int)); dataTable.Columns.Add("Spalte2", typeof(float)); dataTable.Columns.Add("Spalte3", typeof(float)); |
Die .csv-Datei wurde schon überprüft und es wurden keine Fehler gefunden.
Sie sieht ungefähr so aus:
Quelltext
1: 2: 3: 4: 5:
| Spalte1;Spalte2;Spalte3 6;3,29;3,79 4;5,71;6,21 2;3,68;4,18 4;2,4;2,9 |
Ich benutze dabei dies Funktion zum Laden:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| private DataTable GetTableFromCSV(string path) { if (!File.Exists(path)) throw new FileNotFoundException();
FileInfo fileInfo = new FileInfo(path); string connectionString = String.Format("Driver={{Microsoft Text Driver (*.txt; *.csv)}};Dbq={0};", fileInfo.DirectoryName); OdbcConnection connection = new OdbcConnection(connectionString); OdbcDataAdapter da = new OdbcDataAdapter(String.Format("select * from [{0}]", fileInfo.Name), connection); da.Fill(dataTable); return dataTable; }
private void projektÖffnenToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { dataTable.Clear(); dataTable = GetTableFromCSV(openFileDialog1.FileName); } } |
Danke für eure Hilfe!
Trashkid2000 - Sa 26.03.11 17:32
Hallo,
also das Beste ist, Du definierst das Schema:
lege in dem Verzeichnis, in der sich die csv befindet, eine Datei Namens "schema.ini" an.
Der Inhalt ist nach dem Aufbau Deiner csv wie folgt:
Quelltext
1: 2: 3: 4: 5: 6:
| [test.csv] ColNameHeader = True Format=Delimited(;) Col1=Spalte1 Integer Col2=Spalte2 Single Col2=Spalte3 Single |
Und dann funzt das Ganze schon. Achso, und das
dataTable.Columns.Add...
lasse mal lieber weg, denn durch den DataAdapter werden die Felder schon richtig angelegt. Ansonsten brauchst Du nichts an dem Code zu ändern, ausser noch die Connection sowie den DataAdapter zu disposen, also in
using-Blöcke zu packen.
chillermiller - Sa 26.03.11 21:21
Hallo,
danke, klappt perfekt!
Allerdings ist es mir immernoch schleierhaft, wo genau beim Laden die besagte "schema.ini"-Datei verwendet wird. :?
Außerdem sollte die "schema.ini"-Datei wie folgt aussehen (Entschuldigung für die Korrektur :oops:):
Quelltext
1: 2: 3: 4: 5: 6:
| [test.csv] ColNameHeader = True Format=Delimited(;) Col1=Spalte1 Integer Col2=Spalte2 Single Col3=Spalte3 Single |
Habe auch natürlich auf den Tipp hin die Ressourcensparenden Using-Klauseln verwendet: :wink:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| using (OdbcConnection connection = new OdbcConnection(connectionString)) { using (OdbcDataAdapter da = new OdbcDataAdapter(String.Format("select * from [{0}]", fileInfo.Name), connection)) { da.Fill(dataTable); } } |
Also, Dankeschön an Trashkid2000!
Gruß, der chillermiller
Trashkid2000 - So 27.03.11 09:45
Schön, dass es nun klappt.
Mit der Schema.ini kannte ich auch noch nicht und habe es erst in der MSDN gelesen.
Ja, das mit dem Inhalt der Datei: war ein dummer Copy & Paste- Fehler :)
Aber das war ja wohl offensichtlich.
LG
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!