CSV-Datei auslesen mit C#

OP #4118671
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.
Gast #4118795
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.
OP #4118808
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.
Gast #4118861
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren