Eine kleine Klasse die eine CSV-Datei in eine DataTable einliest:
Mit diesem Snippet kann man leicht und schnell eine DataTable aus einer CSV-Datei befüllen was vor allem praktisch ist wenn man in der Datei suchen möchte.
/// <summary>
/// Stellt Methoden bereit um eine CSV-Datei in eine <see cref="System.Data.DataTable"/> einzulesen.
/// </summary>
public static class SimpleCSVAdapter
{
/// <summary>
/// Liest die angegebene CSV-Datei in den Speicher und stellt sie als <see cref="System.Data.DataTable"/> bereit.
/// </summary>
/// <param name="filename">Pfad zur CSV-Datei</param>
/// <param name="seperator">Das verwendete Trennzeichen</param>
/// <param name="firstLineIsHeader">Gibt an ob die erste Zeile eine Spaltenbeschriftung enthält</param>
/// <returns>Das gefüllte DataTable</returns>
public static DataTable Read(string filename, char seperator, bool firstLineIsHeader)
{
DataTable dt = new DataTable();
char[] sep = new char[] {seperator};
bool columnsBuilt = false;
// Datei zum lesen öffnen
using (StreamReader sr = File.OpenText(filename))
{
string current = null;
while ((current = sr.ReadLine()) != null)
{
if (columnsBuilt)
firstLineIsHeader = false;
if (firstLineIsHeader && !columnsBuilt)
{
// Erst den header lesen um die DataTable zu initialisieren
string[] colHeaders = current.Split(sep);
foreach (string s in colHeaders)
{
dt.Columns.Add(s, typeof (string)); // Nur strings
}
columnsBuilt = true;
}
else if (!columnsBuilt)
{
// O.k. dann musst du halt über den Index zugreifen ;-)
string[] colHeaders = current.Split(sep);
for (int i = 0; i < colHeaders.Length; i++)
{
dt.Columns.Add();
}
columnsBuilt = true;
}
if (columnsBuilt && !firstLineIsHeader)
{
// Normale Datensätze
string[] cells = current.Split(sep);
DataRow row = dt.NewRow();
for (int i = 0; i < cells.Length; i++)
{
row[i] = cells[i];
}
dt.Rows.Add(row);
}
}
}
return dt;
}
}
Einlesen und abfragen
_dt = SimpleCSVAdapter.Read(@"test.csv", ';', true);
DataRow[] rows = _dt.Select("Name = 'Peter'");
foreach (DataRow row in rows)
{
Console.WriteLine(string.Format("Name: {0}, Vorname: {1}", row["Name"], row["Vorname"]));
}
Testdatei:
Name;Vorname;Ort;Telefon;Email;Fax;Handy
Peter;Hans;München;12345;hans.peter@gmail.com;12345;123456789
Peter;Schorsch;München;12345;schorsch.peter@gmail.com;12345;123456789
Peter;Martin;München;12345;martin.peter@gmail.com;12345;123456789
Peter;Hermann;München;12345;hermann.peter@gmail.com;12345;123456789
Schlagwörter: CSV Datei, DataTable
Hallo jaensen.
Ist ja gut und schön, aber was passiert wenn in den Daten das Trennzeichen verwendet wird? Dann geht's leider in die Hose.
Gruß cx°
Jawoi! So ist es. Du hast recht, normalerweise gehören die Daten in Anführungsstriche und auf Maskierung geachtet aber das hat mich in dem Moment als ich das Snippet geschrieben habe nicht wirklich gekümmert und tut es immer noch nicht 😉
Für alle die es dennoch brauchen, gibt es zig verschiedenen mer oder weniger
komplexe biblioteken die das abfangen.
Einfach mal bei Codeprojekt suchen.