[C#] Klasa dla pliku CSV

Cześć

mam zamiar zrobić klasę do pliku csv. Plik csv ma ileś tam kolumn, kolumny mają swoje tytuły. Chciałbym teraz wczytać tak plik csv żeby utworzyć listę obiektów mojej klasy ale żeby bez switchów i ifów ręcznie wpisywać dane do odpowiedniego property. Przykład

Klasa

Class testClass

{

public string Col1 { get; set;}

public string Col2 { get; set;}

public string Col3 { get; set;}

}

Plik csv (kolumny specjalnie zamienione)

To jest łatwiejsza część. A co jeśli chciałbym żeby property miało inną nazwę niż kolumna w pliku csv? Jaki mechanizm zastosować?

Dodane 17.07.2013 (Śr) 13:25

Mógłbym zrobić tak że przeiteruje po wszystkich property i sprawdzę czy name zgadza się z tym w csv jeśli tak to setvalue i koniec. Ale właśnie problemem jest to że property nie mogą się nazywać tak samo jak kolumny gdyż w kolumnach występują spacje, znaki specjalne.

Polecam użyć zewnętrznej biblioteki dającej znacznie większe możliwości niż te o których mówisz: http://www.filehelpers.com/ masz tam example of use żeby szybko wdrożyć się w podstawy używania. Jednk są tacy co lubią koło wymyślać na nowo, wtedy masz 2 rozwiązania (pewno jest ich więcej ale tak na poczekaniu tyle wymyśliłem).

  1. Stworzenie mappera - odwzorowanie nazwy z kolumny na nazwę pola, np. jakimś plikiem xml.


     ...
    
  2. Uznanie, że pierwsze pole to pierwsza kolumna, drugie pole to druga kolumna itd. Wtedy nazwa pola klasy / nazwa kolumny nie ma znaczenia.

Nie cierpię posługiwać się indeksami kolumn bo często to się sypie :wink: nagle się zmienią pliki bo ktoś stwierdzi że lepiej kolumnę X mieć na końcu nie na początku i leżę. Dodatkowo okazuje się że plik jest sklejką kilku plików csv które mają różne kolumny, dodatkowo żeby zycie nie było łatwe, same nagłówki kolumn ulegają czasami zmianie. Ehhh czasami ludzie nie są w stanie pojąć co to standard i robią po swojemu a my jako użytkownicy końcowi musimy się męczyć

Nie rozumiem po co, przecież kolejność “kolumn” nie niesie za sobą żadnej informacji. Nie wiem dla kogo piszesz tę aplikację, ale dogadałbym się z klientem przekazując mu sensowne argumenty, że nie ma takiej potrzeby.

To nie ma sensu. Jeśli jest jakiś wyróżnik, to na dobrą sprawę wystarczy podzielić plik i operować na każdym z osobna. W przeciwnym razie nie ma fizycznej możliwości stwierdzić czy mamy do czynienia z wierszem danych czy nagłówkiem.

No i zmieniasz wtedy konfigurację wyżej wymienionego pliku (zaletą tego podejścia jest brak modyfikowania raz napisanego softu). W bazie danych jak ktoś wpadnie by zmienić nazwę kolumny też większość aplikacji się wysypie.

Generalnie twój problem jest natury co się stanie jak obieraczką do ziemniaków zapragniemy obrać arbuza. Jak coś się zmieni to zawsze pociągnie minimalne zmiany i tyle. Najlepszym podejściem programistycznym jest by te zmiany nie wpływały na kod (każda zmiana dobrze napisanego oprogramowania to możliwość pomyłki) i tu plik mapujący wydaje się być najlepszym dostępnym rozwiązaniem. W razie potrzeby zmienisz tylko konfigurację i wio.

Nie mam żadnego wpływu na to. Chodzi o to że np. 25 pierwszych kolumn jest mi w ogóle nie potrzebne ale 4 ostatnie tak. Jeśli przyjmę na wiarę że się nic nie zmieni z indeksami a się zmieni to leżę.

To sobie podzielę, nie ma problemu. Jest wyróżnik. Po prostu nagle czytając dane jednej CSV masz znowu nagłówki kolumn a to się bez problemu wykryje.

Tutaj miałem na myśli to że czasami dla tych samych danych zmienia się nagłówek kolumny i zawiera on tą samą informację co w przypadku innego nagłówka kolumny. Mam rozumieć że wtedy kilka field_name mapuję do jednej kolumny? Dodatkowo struktura csv zależy od wartości np. w 6 kolumnie. Jak tam będzie ABC to csv będzie miał 30 kolumn gdzie tylko 4 kolumny to dane, a jak tam będzie XYZ to będzie miało 50 kolumn i 25 kolumn to dane. Dodatkowo też czasami jest tak że kolumna numer 6 może być taka sama ale kolumna 10 jest inna i wtedy znowu struktura jest inna :smiley: Wychodzi na to że dla każdej odmiany CSV będę musiał zrobić nową klasę, na szczęście część się powtarza więc mogę zrobić klasę główną i z niej dziedziczyć dodając nowe pola.

Ogólnie te dane są bardzo nieprzyjemne, ktoś pisząc to miał jakieś swoje założenia i tyle. Później jak już tak zrobił to zostało tak od paru lat.