Autor Beitrag
chillermiller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Sa 26.03.11 12:55 
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:
ausblenden 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:
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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:):
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



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