C# CSV aus Zeilen Spalten machen

Mijay

Ensign
Registriert
Apr. 2010
Beiträge
138
Hallo zusammen,

eigentlich sollte das überhaupt nicht schwierig sein, nur derzeit geht irgendwie nichts in meinen Kopf.
Ich habe eine CSV Datei mit folgendem Format:
zahl; text; zahl; zahl; zahl; zahl etc.
360;kWh;123;123;123;123
370;m;12;12;12;12

Die CSV Datei enthält mehrere Zeilen, welche einfach Spalten werden sollen:
A B
360 370
kwH m
123 12
123 12
123 12
123 12

Ich lese die Datei ein, splitte sie mir zurecht und wenn ich die jetzt wegschreibe werden alle Werte aus allen Zeilen untereinander in Spalte A geschrieben. Das verstehe ich, da ich nie sage schreibe ab jetzt in eine neue Spalte. Wie mache ich das?
Ich habe auf die schnelle was hingeklatscht, also sry für komischen Code:
Code:
            List<string> datalist = new List<string>();
            StreamReader sr = new StreamReader(@"C:\test\test.csv");
            datalist.Add(sr.ReadToEnd());
            sr.Close();

            string data = datalist[0];
            string[] datasplit = data.Split('\n');
            string[] split;
     
            StreamWriter sw = new StreamWriter(@"C:\test\out.csv");

            foreach (string s in datasplit)
            {
                split = s.Split(';');
                foreach (string st in split)
                {
                    sw.WriteLine(st);

                    if (st.Contains('\r'))
                    {
                        sw.Write("{0}\n", st);
                        // ab jetzt neue Spalte
                    }
                    else
                    {
                        sw.Write("{0}\n", st);
                    }
                }

            }
            sw.Close();

Kann mir da einer helfen?
Gruß
Mijay
 
Ladevorgang:
1.) Alle Zeilen einlesen
2.) Mit String.Split nach Cr, Lf und CrLf splitten (Leerzeilen auslassen).
3.) Erste Zeile nach ; splitten (zumindest wenn du auf " und ; in den Daten verzichten kannst)
4.) Die Anzahl der Spalten zählen
5.) Ein Zweidimensionales Array mit x Zeilen und y Spalten anlegen.
6.) Für alle Zeilen durchführen (for Schleife):
6.1) Zeile nach ; splitten
6.2) Überprüfen, ob die Spaltenanzahl gleich ist (wenn geringer, dann kannst du sie bei Bedarf mit Leerstring auffüllen
6.3) In einer zweiten for Schleife alle Werte in dein Feld kopieren: Werte[j] = AktuelleZeile[j]

Speichervorgang:
Mit zwei geschachtelten for Schleifen einfach alles ausgeben:

for(int i=0;i<RowCount;i++)
{
for(int j=0;j<ColumnCount;j++)
{
Write(Feld[j]);
if(j<ColumnCount-1)
Write(";");
}
if(i<RowCount-1)
Write("\n");
}

Wenn du die Zeilen/Spalten umdrehen willst, dann einfach i und j vertauschen:
i<ColumnCount,j<RowCount, Write(Feld[j])
 
toeffi schrieb:
Auch hier möchte ich wieder die using-Direktive für den StreamReader ans Herz legen.

Es lohnt sich nur dann, wenn du keine Fehlerbehandlungen machen willst. Also, nur dann Wenn die Daten redundant sind und verworfen werden können.

Mit Using kann man lästige Codezeilen vorbeugen. Fehlermeldungen wird man damit nicht vorbeugen können, wenn man mit dem Daten Arbeiten will die in der Using erstellt werden.
 
Ob es sich lohnt oder nicht lohnt steht nicht zur Debatte.
Es geht darum das du zum 1. kein Stream.Close vergessen tuest ausversehen und zum 2. das das ganze Exceptionsafe ist, im Sinne das wenn eine Exception fliegt und diese nicht behandelt wird, der Stream trotzdem geschlossen wird. Das heißt ALLES was IDisposable implementiert sollte in einem using-Block genutzt werden, bis auf ein paar Ausnahmen.
 
Zurück
Oben