Dany
2,1016,7 / 31/2008 14: 22, Geoff Dalgas , 6/5/2011 22:21, http://stackoverflow.com , „Corvallis, OR”, 7679,351,81, b437f461b3fd27387c5d8ab47a293d35,34
Jak używać C # do podzielenia powyższych informacji na ciągi w następujący sposób:
2
1016
7/31/2008 14:22
Geoff Dalgas
6/5/2011 22:21
http://stackoverflow.com
Corvallis, OR
7679
351
81
b437f461b3fd27387c5d8ab47a293d35
34
Jak widać, jedna z kolumn zawiera, <= (Corvallis, OR)
// aktualizacja // Na podstawie C # Regex Split - przecinki poza cudzysłowami
string[] result = Regex.Split(samplestring, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
Odpowiedzi:
Skorzystaj z
Microsoft.VisualBasic.FileIO.TextFieldParser
klasy. Spowoduje to przeanalizowanie rozdzielanego plikuTextReader
lub sytuacji, wStream
których niektóre pola są zawarte w cudzysłowach, a inne nie.Na przykład:
Powinno to dać następujący wynik:
Aby uzyskać więcej informacji, zobacz Microsoft.VisualBasic.FileIO.TextFieldParser .
Należy dodać odwołanie do
Microsoft.VisualBasic
na karcie Dodaj odwołania .NET.źródło
Jest już bardzo późno, ale może to być pomocne dla kogoś. Możemy użyć RegEx jak poniżej.
źródło
,
\„ df ”,Możesz podzielić na wszystkie przecinki, po których występuje parzysta liczba cudzysłowów.
Chciałbyś również zobaczyć w
specf
formacie for CSV o obsłudze przecinków.Przydatny link:
C# Regex Split - commas outside quotes
źródło
Widzę, że jeśli wkleisz tekst rozdzielany CSV w programie Excel i wykonasz polecenie „Tekst do kolumn”, zostanie wyświetlony monit o podanie „kwalifikatora tekstu”. Domyślnie jest to podwójny cudzysłów, więc traktuje tekst w cudzysłowie jako dosłowny. Wyobrażam sobie, że Excel implementuje to, przechodząc po jednym znaku na raz, jeśli napotka „kwalifikator tekstu”, przechodzi do następnego „kwalifikatora”. Prawdopodobnie możesz zaimplementować to samodzielnie za pomocą pętli for i wartości logicznej, aby wskazać, czy znajdujesz się w dosłownym tekście.
źródło
Skorzystaj z biblioteki, takiej jak LumenWorks, do czytania CSV. Będzie obsługiwał pola z cudzysłowami i prawdopodobnie będzie ogólnie bardziej niezawodny niż Twoje niestandardowe rozwiązanie, ponieważ istnieje od dłuższego czasu.
źródło
Analiza plików .csv jest trudna, gdy plik .csv może składać się z ciągów oddzielonych przecinkami, ciągów znaków w cudzysłowie lub chaotycznej kombinacji tych dwóch. Rozwiązanie, które wymyśliłem, pozwala na dowolną z trzech możliwości.
Stworzyłem metodę ParseCsvRow (), która zwraca tablicę z łańcucha csv. Najpierw zajmuję się podwójnymi cudzysłowami w ciągu, dzieląc ciąg w podwójnych cudzysłowach na tablicę o nazwie quotesArray. Pliki .csv z cytatami są poprawne tylko wtedy, gdy występuje parzysta liczba podwójnych cudzysłowów. Podwójne cudzysłowy w wartości kolumny należy zastąpić parą podwójnych cudzysłowów (takie jest podejście programu Excel). Dopóki plik .csv spełnia te wymagania, można oczekiwać, że przecinki ograniczające będą pojawiać się tylko poza parami podwójnych cudzysłowów. Przecinki w parach podwójnych cudzysłowów są częścią wartości kolumny i należy je zignorować podczas dzielenia pliku .csv na tablicę.
Moja metoda sprawdzi, czy przecinki nie znajdują się w podwójnych cudzysłowach, patrząc tylko na parzyste indeksy tablicy cudzysłowu. Usuwa również podwójne cudzysłowy z początku i końca wartości kolumn.
Jedną z wad mojego podejścia jest sposób, w jaki tymczasowo zastępuję przecinki separatora niejasnym znakiem Unicode. Ten znak musi być tak niejasny, aby nigdy nie pojawił się w twoim pliku .csv. Możesz zająć się tym problemem.
źródło
Miałem problem z plikiem CSV, który zawiera pola ze znakiem cudzysłowu, więc używając TextFieldParser, wymyśliłem:
StreamReader jest nadal używany do odczytywania CSV wiersz po wierszu, w następujący sposób:
źródło
Dzięki Cinchoo ETL - bibliotece open source, może automatycznie obsługiwać wartości kolumn zawierające separatory.
Wynik:
Więcej informacji można znaleźć w artykule codeproject.
Mam nadzieję, że to pomoże.
źródło