Skocz do zawartości

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Tartar

[C#] Problem z podziałem csv do datatable

Rekomendowane odpowiedzi

Witam wszystkich.

 

Mam problem z podziałem linii pobranej z pliku csv na dane do DataTable.

 

Linia z csv wygląda tak (oczywiście w skrócie bo faktycznie jest tam ponad 70 pól):

0125,"Jakiś tekst","atr",456
1125,"Jakiś, tekst","atr=""Nie""",486
0125,"Jakiś tekst","atr=""Nie"",atr2=""TAK""",456

Podział na kolumny jest po przecinku i prawidłowo powinno wyglądać to tak (4 kolumny) - jak jest przecinek w cudzysłowiu to ma nie dzielić tego (znak | służy w przykładzie jako rozdzialacz kolumn):

0125 | "Jakiś tekst" | "atr" | 456 
1125 | "Jakiś, tekst" | "atr=""Nie""" | 486 
0125 | "Jakiś tekst" | "atr=""Nie"", atr2=""TAK""" | 456

Podział robię za pomocą wyrażenia regularnego (znalazłem go w sieci i ciut zmodyfikowałem ale niestety jestem w tym kiepski) i dzieli mi tak:

0125 | "Jakiś tekst" | "atr" | 456 
1125 | "Jakiś, tekst" | "atr=" | 486 
0125 | "Jakiś tekst" | "atr=" | atr2=""TAK""" | 456

 

Wyrażenie jest takie: (?:^|,)(\"(?:[^\"])*\"|[^,]*)

Wiem, że raczej na pewno rozwiązanie znajduje się w tym wyrażeniu tylko nie potrafię go znaleźć. Proszę o naprowadzenie ewentualnie wskazanie gdzie konkretnie popełniam błąd.

 

 

Mam też prośbę o wytłumaczenie kilku zagadnień w najprostszy sposób:

 

1. LINQ a konkretnie joiny (w sql radzę sobie z tym) -

(Czytałem na stronach MS i kilku innych z przykładami ale jakoś nie potrafię tego zrozumieć)

Mamy przykładowo 2 DataTable:

DT1

ID | Nazwa| Cena

1 | N1 | 1,5

2 | N2 | 2,5

3 | N3 | 3,5

4 | N4 | 4,5

 

DT2

ID | ID_DT1 | Ilosc

1 | 1 | 15

2 | 3 | 5

3 | 4 | 10

 

Pytanie jak na tym przykładzie zrobić:

a) left join

b) inner join

c) right join

d) outer join

 

Przykładowo coś takiego (pseudokod uproszczony)

var wynik = from d1 in DT1
	join d2 in DT2
	on d1.ID equals d2.ID_DT1
	select d1.Nazwa, d1.Cena, d2.Ilosc

W teorii jest left joinem (wg tego co zrozumiałem z przykładów z sieci) ale jak i dlaczego to nie wiem (w sql przynajmniej składnia jest LEFT JOIN).

 

2. Mam program, który coś mi tam robi i z menu chcę wybrać Wydruk, gdzie otwiera mi się okno z różnymi opcjami.

Okno to chciałbym móc zmieniać dodając różne opcje ale bez potrzeby kompilacji głównego programu (np. poprzez podmianę jakiegoś pliku).

Robić to poprzez np. wywołanie oddzielnego programu z parametrami? Czy może jakoś jeszcze inaczej?

 

Z góry dziękuję za pomoc.

 

Pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wg mnie źle się za to zabierasz. Własnoręczne dzielenie csv przy pomocy regexa to zapowiedź katastrofy. Poszukałbym biblioteki (o ile sam standard języka tego nie ma), która parsuje csv i marshalluje je do obiektu domenowego, który potem wykorzystujesz we frameworku do obsługi bazy danych. Dodatkowo coś takiego, jak "key=""val""" nie wygląda mi na dobrą praktykę.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

https://stackoverflow.com/a/20523165

 

2. Co do programu to jeżeli projekt był by oparty o WPFa to powinno dać radę, dawno temu widziałem gdzieś ładowanie UI(xamla) z zewnętrznego pliku, tylko musiał byś to dopasować to do istniejącej logiki...

 

Tylko musisz brać pod uwagę, że logikę prawdopodobnie też trzeba będzie zaktualizować co jakiś czas.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziękuję za odpowiedzi i przepraszam, że dopiero teraz odpisuję.

 

@Karister

Dodatkowo coś takiego, jak "key=""val""" nie wygląda mi na dobrą praktykę.

To nie mój wymysł - tak jest w pliku csv (dokładnie z Magento)

 

@Matt91111

Dziękuję za linka - ta biblioteka Csv Helper jest świetna. Pięknie mi dzieli plik tak jak chciałem.

 

Problem z podziałem pliku csv uważam za zamknięty.

Reszta nadal aktualna.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...