Frage von cinti6191, 52

Hallo wie kann man die daten aus dieser CSV datei einlesen und in objekten einer klasse speichern in C#?

firstName;lastName;birthday;typeOfPerson

Peter;Müller;09.06.1984;MA

Fritz;Lüders;20.06.1973;P

Hans;Ziehzahn;01.03.1915;P

das ist der Inhalt der CSV-Datei

Antwort
von cinti6191, 33

geht das auch ohne datagridview

Antwort
von PWolff, 32

Mit reinen C#-Methoden geht das nicht ohne eine eigene Funktion / Klasse zu definieren. Das ist aber nicht weiter schwer.

Du kannst aber auf Microsoft.VisualBasic.FileIO.TextFieldParser zurückgreifen. (Dazu musst du dem Projekt einen Verweis auf den Namespace "Microsoft.VisualBasic" hinzufügen. - Menü Projekt -> Verweise etc.)

Beispiel:

using (Microsoft.VisualBasic.FileIO.TextFieldParser parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(dateiname, Encoding.Default)) {
  parser.Delimiters = new string[]{";"}; // oder/und andere Trennzeichen
  while (!parser.EndOfData) {
    string[] felder = parser.ReadFields();
    // hier den Inhalt des Arrays felder nutzen
  };
  parser.Close();
};

das Abfangen von Ausnahmen und das Aufbereiten der Felder musst du selber hinzufügen.

Wenn du ein wenig VisualBasic verstehst, kannst du dir auch dies ansehen: http://www.activevb.de/tipps/vbnettipps/tipp0117.html

Kommentar von ceevee ,

Das parser.close() ist überflüssig (und ich glaub sogar eine potentielle Fehlerquelle), weil der parser eh geclosed wird, wenn die using-Direktive durch ist.

Und die Variante, die Omnivore08 vorschlägt, ist eigentlich genauso lang und braucht keine zusätzlichen Klassen / Methoden. Das müsste dann ungefähr so aussehen:

using (StreamReader reader = new StreamReader("C:/bla.txt")) {
while (!reader.EndOfStream) {
string line = reader.Readline();
string[] splitLines = line.Split(";");
// hier was mit dem string-Array machen.
}
}
Kommentar von Omnivore08 ,

Und die Variante, die Omnivore08 vorschlägt, ist eigentlich genauso lang und braucht keine zusätzlichen Klassen / Methoden. Das müsste dann ungefähr so aussehen:

Korrekt! Nur wollte ich dem Fragesteller ein wenig Möglichkeit zum selbst programmieren lassen :-)

Und ich würde eher die bla.csv nehmen statt die bla.txt xDxD

Das mit dem Close stimmt übrigends. Die Ressource wird bei der Dispose-Routine wieder freigegeben.

Kommentar von PWolff ,

Das mit dem Split() ist mir auch aufgefallen.

Meine ursprüngliche Überlegung war, dass ich irgendwo etwas von einem Textparser gesehen hatte.

Inzwischen hab ich's auch mal ausprobiert - der Parser kommt (im Gegensatz zu Split()) auch mit so was problemlos klar:

14;"Text mit Semikolon; das geht hier auch";"ein Semikolon; ist kein Problem."

 Was das Close() betrifft - ich betrachte das using als einen Notanker für den Fall, das etwas schiefgeht. Dass das Close() am Ende des using-Blocks ausgeführt wird, liegt daran, dass es von der Dispose()-Methode des Parsers aufgerufen wird. Aber ich fühle mich unwohl bei dem Gedanken, eine Sicherheitsstruktur für den regelmäßigen Gebrauch zu verwenden.

Kommentar von CrystalixXx ,

Aber genau das sollte man tun, denn dafür sind solche Konstrukte vorhanden. Auf solche Strukturen zu verzichten hieße gleichzeitig auf Sicherheit zu verzichten. Das sind dann immer die Hauptursachen für Speicherprobleme oder Zugriffsprobleme auf Dateien/Verzeichnisse, wenn man diese häufiger öffnen möchte. Die Using-Anweisung ist nichts anderes als ein Try-Finally und sorgt für Aufräumarbeiten - selbst in Ausnahmefällen. Darin besteht der Vorteil.

Im Grunde kann man bei der Verwendung der Using-Konstrukte keine Fehler bei zu häufigem Einsatz machen, im Gegensatz zum übermäßgen Gebrauch von Try-Catch, weil Using sowieso nur Resourcen entgegennimmt, die IDispose implementieren.

Antwort
von Omnivore08, 26

Namensraum: System.IO

Klasse: StreamReader

Methode: string ReadLine()

Den String mit myString.slit(';'); aufteilen

Teils-Strings in Konstruktor klatschen

fertig

Viel spaß

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten