Forum: PC-Programmierung CSV-Datei auslesen mit C#


von Patrick L. (crashdemon)


Lesenswert?

Hallo Leute,

ich möchte eine CSV-Datei mit C# auswerten, die aus mehreren Zeilen und 
Spalten besteht. Die Grundsätzliche Form sieht wie folgt aus:

xxx,xxx,xxx,xxx,xxx,xxx<CR>
xxx,xxx,xxx,xxx,xxx,xxx<CR>
xxx,xxx,xxx,xxx,xxx,xxx<CR>
xxx,xxx,xxx,xxx,xxx,xxx<CR>
xxx,xxx,xxx,xxx,xxx,xxx<CR>
...

Wie ich die Datei einlesen und in die einzelnen Werte aufteile ist mir 
grundsätzlich klar. Allerdings habe ich ein paar Designfragen.

1. Wie speichert man die Daten am besten, mit einer Liste, Dictionary, 
Dataset?

2. Ich möchte später nach einem bestimmten Wert in der ersten Spalte 
suchen und die Datensätze (Datensatz definiere ich als eine 
zusammenhängende Zeile) ich eine weiters Objekt speichern.

Also z.B. möchte ich alle Datensätze die in der ersten Spalte eine drei 
stehen haben in eine neue Liste, Dictionary bzw. Dataset schreiben.

von Peter II (Gast)


Lesenswert?

Patrick L. schrieb:
> 1. Wie speichert man die Daten am besten, mit einer Liste, Dictionary,
> Dataset?

ich würde eine stuct anlegen und diese in liste speichern.

von bluppdidupp (Gast)


Lesenswert?

Ein Blick auf nuget-Pakete kann da vllt. auch nicht schaden:
https://www.nuget.org/packages?q=csv

von Klaus P (Gast)


Lesenswert?

Patrick L. schrieb:
> Wie ich die Datei einlesen und in die einzelnen Werte aufteile ist mir
> grundsätzlich klar. Allerdings habe ich ein paar Designfragen.

Trotzdem der Verweis auf 
http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader

>
> 1. Wie speichert man die Daten am besten, mit einer Liste, Dictionary,
> Dataset?

Das kommt darauf an, was du damit machen willst und um wieviele 
Datensätze es sich handelt.

>
> 2. Ich möchte später nach einem bestimmten Wert in der ersten Spalte
> suchen und die Datensätze (Datensatz definiere ich als eine
> zusammenhängende Zeile) ich eine weiters Objekt speichern.
>
> Also z.B. möchte ich alle Datensätze die in der ersten Spalte eine drei
> stehen haben in eine neue Liste, Dictionary bzw. Dataset schreiben.

Eine DataTable (ggf. auch aus einem Typed Dataset) ist bequem, weil es 
eine Select methode anbietet. Bei kleinen Datenmengen, ist das meistens 
die erste Wahl, weil man damit flexibel ist.

Eine einfache Liste nimmt man nur dann, wenn die spätere Suche kaum 
vorhersagbar ist und wenn man annehmen kann, dass man bei der Suche 
sowieso alle Objekte durchgehen muss. Das kommt aber kaum vor. Wenn man 
aber sowieso für andere Zwecke die Objekte durchiterieren muss, kann man 
hingegen eine Liste durchaus benutzen.

Ein Dictionary kann man nehmen, wenn man die Kriterien, nach denen 
später wird, schon kennt und wenn sie eindeutig sind. Dann könnte man 
z.B. Dictionary<int, List<myobjectType>> nehmen. Ist aber recht 
unflexibel.

Bei größeren Datenmengen kann man eine SQLite Datenbank einbinden.

Bei kleinen Datenmengen und seltenen Suchoperationen ist das alles eher 
Geschmackssache.

von Patrick L. (crashdemon)


Lesenswert?

Danke für die Antworten.

Also die Datenmenge ist eher gering, vllt. bis 8000 Zeilen. Es geht um 
Daten die mit dem Openlog von Sparkfun auf SD-Karte protokolliert 
werden. Einige Spalten möchte ich graphisch darstellen.

Wichtig wäre noch, das beim extrahieren einer Teilmenge diese ihre 
Reiehnfolge beibehält.

Also:

xxx,xxx,xxx,xxx,xxx,xxx<CR>
300,xxx,001,xxx,xxx,xxx<CR>
300,xxx,002,xxx,xxx,xxx<CR>
300,xxx,003,xxx,xxx,xxx<CR>
xxx,xxx,xxx,xxx,xxx,xxx<CR>

sollte

300,xxx,001,xxx,xxx,xxx<CR>
300,xxx,002,xxx,xxx,xxx<CR>
300,xxx,003,xxx,xxx,xxx<CR>

ergeben. und nicht:

300,xxx,002,xxx,xxx,xxx<CR>
300,xxx,001,xxx,xxx,xxx<CR>
300,xxx,003,xxx,xxx,xxx<CR>

Aus den bisherigen Antworten konnte ich noch keine Best-Practice Methode 
ableiten.

von Slartibartfaß (Gast)


Lesenswert?

Nur mal in den Raum geworfen - mit dem freien GNUPLOT geht das 
vermutlich auch ohne Programmieren.

gnuplot> plot "SPARKLOG.CSV"

Ob das mit dem Filtern klappt muss man sich einlesen

von Patrick L. (crashdemon)


Lesenswert?

Slartibartfaß schrieb:
> Nur mal in den Raum geworfen - mit dem freien GNUPLOT geht das
> vermutlich auch ohne Programmieren.

Ja schon klar. Mit Excel geht es auch. Ich will aber eine handgemachte 
Lösung. Außerdem müssen die Messwerte noch umgerechnet werden.

von R. Rebentrost (Gast)


Lesenswert?

In C# würde ich bei so wenig Daten das Ganze in eine Liste einlesen (pro 
Zeile ein Objekt) und per LINQ abfragen.

"Also z.B. möchte ich alle Datensätze die in der ersten Spalte eine drei
stehen haben in eine neue Liste [...]"

Wäre dann ein Einzeiler.

von Klaus. P. (Gast)


Lesenswert?

Patrick L. schrieb:
> Aus den bisherigen Antworten konnte ich noch keine Best-Practice Methode
> ableiten.

Ich wage einmal zu behaupten, dass es die auch nicht gibt. Das ist schon 
etwas Geschmackssache. Ich persönlich würde die DataTable benutzen, aber 
nur aus Gewohnheit.

von Patrick L. (crashdemon)


Lesenswert?

Klaus. P. schrieb:
> Ich wage einmal zu behaupten, dass es die auch nicht gibt. Das ist schon
> etwas Geschmackssache. Ich persönlich würde die DataTable benutzen, aber
> nur aus Gewohnheit.

Vermutlich hast du recht. Allerdings finde ich den Tipp mit der 
DataTable soweit ich das überblicken kann als am besten für meine 
Problemstellung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.