sortowanie pliku csv

1

Cześć,

mam duży plik csv (10 MB, ale może być większy) i chciałbym go posortować. Ma on trzy linie z nagłówkiem, pola są rozdzielane średnikami, ilość kolumn jest znana dopiero w trakcie wykonania (stąd też myślałem raczej o List<List<string>>, zamiast tablicy), na podstawie nagłówka mogę znaleźć numery kolumn, według których chciałbym sortować (np. dla pięciu kolumn, chciałbym sortować kolejno według pierwszej, trzeciej i czwartej) + wolałbym raczej uniknąć korzystania z Cygwina czy innych podobnych.

Czy jest jakiś sposób, który możecie polecić, spełniający takie założenia?

Szukałem rozwiązań i przede wszystkim widziałem dla sortowania tablic, nie list, do tego często jednowymiarowych. Znalazłem też programy, które mogę wywołać z linii komend, ale nie uwzględniające sortowania z kilkoma poziomami (najpierw według jednej kolumny, potem według innej). W sumie szukam najprostszego rozwiązania.

Pozdrawiam!

1

Pierwszy pomysł na jaki wpadłem to po prostu napisać algorytm, ale później zwróciłem uwagę że to jest plik csv, czyli baza danych więc w sumie warto zrobić z tego http://stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable i później sortować, ale nie jestem pewien czy to spełni twoje wymagania.

1

To może użyjesz OLEDB i wykonasz na pliku zapytanie SQL ?

1

Dzięki za odpowiedzi!

Adapter tworzę w ten sposób (na podstawie http://tech.pro/tutorial/803/csharp-tutorial-using-the-built-in-oledb-csv-parser):

System.Data.OleDb.OleDbDataAdapter dAdapter = new System.Data.OleDb.OleDbDataAdapter(query, connString);

gdzie zmienne są następujące

query = "SELECT * FROM plik.csv"

connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\katalog\";Extended Properties="text;HDR=No;FMT=Delimited""

Wypełniam go w taki sposób:

System.Data.DataTable dTable = new System.Data.DataTable();
dAdapter.Fill(dTable);

i w momencie wykonywania fill otrzymuję

Message: Nie mozna zaktualizować. Baza danych lub obiekt dostępny jest tylko do odczytu.

Stack trace: System.Data.OleDb.OleDbCommand.ExecuteOmmandTextErrorHandling(OleDbHResult hr) ...

To mnie trochę dziwi, bo przecież potrzebuję tego pliku tylko do odczytu. Jeszcze się upewnię, że nie mam pliku gdzieś otwartego, chociaż nie sądzę. Anglojęzyczny odpowiednik to "Cannot Update. Database Or Object Is Read-only".

Być może problemem jest też nagłówek (te trzy linie, które maja inna ilość kolumn, niż linie z danymi w csv), ale nie widzę prostego sposobu (lepszego, niż przepisanie pliku z pominięciem pierwszych trzech linii), żeby wykonać zapytanie od czwartej linii, zamiast "select * from".

A ten link (http://devlicio.us/blogs/sergio_pereira/archive/2008/09/17/tip-export-to-csv-using-ado-net.aspx) może się przyda, jak już przeczytam dane i będę chciał posortowane zapisać do pliku wyjściowego, ale temu się dokładniej przyjrzę, jak już będę mógł utworzyć DataTable z csv i posortować.

Pozdrawiam!


Znalazłem informację (http://stackoverflow.com/questions/9069309/reading-excel-with-c-sharp), aby dodać do connection string ";IMEX=1". To powoduje nowy komunikat "Could not find installable ISAM" ("Nie można znaleźć instalowalnego pliku ISAM"). Równiez i na to znalazłem odpowiedź ("What I had to do is save the file to the server, then connect to it from there" - http://www.dreamincode.net/forums/topic/218277-cannot-update-database-or-object-is-read-only/), jednak nie ma ona zastosowania w moim przypadku.

1

Jako że mi przykład ze strony działa bez zarzutu, więc może sprawdź swój plik we właściwościach pod windowsem czy nie masz tam coś pozaznaczane. :P

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.