Parsowanie pliku CSV. Separator w treści komórki.

Parsowanie pliku CSV. Separator w treści komórki.
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:minuta
  • Postów:1857
0

Witam.

Temat pewnie banalny, ale utknąłem i nie mogę ruszyć z miejsca.

Mam plik CSV który chce sparsować do listy obiektów.
Problemem jest to, że w treści pojedynczej komórki może występować separator, ale wtedy taki ciąg zamknięty jest w cudzysłów.
Np:

Kopiuj
imie,nazwisko,funkcja
tomasz,nowak,kierowca
karol,wiśniewski,"malarz, akrobata"

Jak najprościej do tego podejść?
Próbowałem wykorzystać bibliotekę CSVHelper, ale też nie przyniosło to rezultatów...

edytowany 1x, ostatnio: hipekk
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około godziny
1

Pokaż jak wykorzystujesz CsvHelper, bo ja mam taki sam przypadek i działa :)

HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:minuta
  • Postów:1857
0

Z CsvHeloper to w ogóle coś nie gra :)

Mój kod:

Kopiuj
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    Delimiter = ","
};

using (var reader = new StreamReader($@"d:\TEST\test.csv"))
using (var csv = new CsvReader(reader, config))
{
    var records = csv.GetRecords<dynamic>();
}

nie wiem czemu csv jest pusty
screenshot-20220215105405.png

Upewniłem się czy podaje prawidłową ścieżkę do pliku:
screenshot-20220215105559.png

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10077
0
hipekk napisał(a):

Witam.

Temat pewnie banalny, ale utknąłem i nie mogę ruszyć z miejsca.

Mam plik CSV który chce sparsować do listy obiektów.
Problemem jest to, że w treści pojedynczej komórki może występować separator, ale wtedy taki ciąg zamknięty jest w cudzysłów.
Np:

Kopiuj
imie,nazwisko,funkcja
tomasz,nowak,kierowca
karol,wiśniewski,"malarz, akrobata"

Jak najprościej do tego podejść?
Próbowałem wykorzystać bibliotekę CSVHelper, ale też nie przyniosło to rezultatów...

A co jakbyś miał cudzysłów w wartości? ;)

HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:minuta
  • Postów:1857
0

Z ciekawości sprawdziłem co w taki przypadku robi Calc (z pakietu LibreOffice):
Mam arkusz:
screenshot-20220215133631.png

Zapisuje do csv, jako separator mam przecinek, a ogranicznik tekstu cudzysłów
screenshot-20220215133516.png

Wynik:
screenshot-20220215133723.png

Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10077
0
hipekk napisał(a):

Wynik:
screenshot-20220215133723.png

No to jeszcze sprawdź co zrobi jak wpiszesz foo"",""bar i będziemy mieć wszystko :>

HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:minuta
  • Postów:1857
1

Gotowe:

Kopiuj
imie,nazwisko,funkcja
tomasz,nowak,kierowca
karol,wiśniewski,"malarz, ""kucharz"", akrobata"
4programmers,test,"foo"""",""""bar"
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10077
0

No, czyli wychodzi że znak " trzeba zaencodować w "".

HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:minuta
  • Postów:1857
0

Nie do końca rozumiem co masz na myśli szczerze mówiąc... :/

Możesz szerzej?

Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około godziny
0

Że tak powiem - no u mnie działa :)

screenshot-20220215215817.png

S9
o co chodzi z tym using pod using?
Ktos
To samo co zagnieżdżone w sobie using.
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:minuta
  • Postów:1857
2

Nie mam pojęcia czemu to u mnie nie działa...

Napisałem na szybko swój parser i z głowy ;)

SA
Dobry plot twist, przy okazji to musi być strasznie bieda-parser, ktory co prawda nie działa dla wielu przypadkow, ale przynajmniej cudzysłowy ogarnia.
KamilAdam
Plot twist to by był jakby wydał teraz swoją bibliotekę do parsowania i zaczał ją reklamować na 4p :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.