Feedback

CSV Datei in DataTable einlesen

Sprache: C#

Liest eine CSV Datei aus und gibt den Inhalt in einer DataTable zurück. benötigte Namespaces: System.IO
/// <summary>
/// Gibt den Inhalt einer CSV Datei in einer DataTable zurück
/// </summary>
/// <param name="path">Pfad der CSV Datei</param>
/// <param name="seperator">Zeichen mit dem die Spalten getrennt werden. Meist ';' oder ','</param>
/// <returns></returns>
private DataTable GetDataTable(string path, char seperator)
{
    DataTable dt = new DataTable();
    FileStream aFile = new FileStream(path, FileMode.Open);
    using (StreamReader sr = new StreamReader(aFile, System.Text.Encoding.Default))
    {
        string strLine = sr.ReadLine();
        string[] strArray = strLine.Split(seperator);

        foreach (string value in strArray)
            dt.Columns.Add(value.Trim());

        DataRow dr = dt.NewRow();

        while (sr.Peek() > -1)
        {
            strLine = sr.ReadLine();
            strArray = strLine.Split(seperator);
            dt.Rows.Add(strArray);
        }
    }
    return dt;
}
/// <summary>
/// Gibt den Inhalt einer CSV Datei in einer DataTable zurück
/// </summary>
/// <param name="path">Pfad der CSV Datei</param>
/// <param name="seperator">Zeichen mit dem die Spalten getrennt werden. Meist ';' oder ','</param>
/// <returns></returns>
private DataTable GetDataTable(string path, char seperator)
{
    DataTable dt = new DataTable();
    FileStream aFile = new FileStream(path, FileMode.Open);
    using (StreamReader sr = new StreamReader(aFile, System.Text.Encoding.Default))
    {
        string strLine = sr.ReadLine();
        string[] strArray = strLine.Split(seperator);

        foreach (string value in strArray)
            dt.Columns.Add(value.Trim());

        DataRow dr = dt.NewRow();

        while (sr.Peek() > -1)
        {
            strLine = sr.ReadLine();
            strArray = strLine.Split(seperator);
            dt.Rows.Add(strArray);
        }
    }
    return dt;
}

1 Kommentar

  1. Der Code taugt natürlich nicht viel.

    Er geht schief, wenn *Daten* den Seperator enthalten. Das ist laut RFC 4180 erlaubt, ebenso wie Daten, die einen Zeilenumbruch enthalten (hier geht obiger Code auch schief).

    Eine brauchbare C#-CVS-Bibliothek, die mit dem CSV umgehen kann, dem man in der Realität begegnet – und zudem rasend schnell ist – findet man hier:
    http://www.codeproject.com/KB/database/CsvReader.aspx

    Beispiel-CSV aus der Wikipedia, welches schon schiefgeht:

    Stunde;Montag;Dienstag;Mittwoch;Donnerstag;Freitag
    1;Mathe;Deutsch;Englisch;Mathe;Kunst
    2;Sport;“Religion ev;kath“;Kunst;Deutsch;Kunst