Laden...

CSV-Dateien in DataTable einlesen

Erstellt von jaensen vor 15 Jahren Letzter Beitrag vor 15 Jahren 11.235 Views
jaensen Themenstarter:in
2.760 Beiträge seit 2006
vor 15 Jahren
CSV-Dateien in DataTable einlesen

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

190 Beiträge seit 2005
vor 15 Jahren

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°

jaensen Themenstarter:in
2.760 Beiträge seit 2006
vor 15 Jahren

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
10.010 Beiträge seit 2004
vor 15 Jahren

Für alle die es dennoch brauchen, gibt es zig verschiedenen mer oder weniger
komplexe biblioteken die das abfangen.

Einfach mal bei Codeprojekt suchen.