Nie rozumiem, jeśli masz jasny obraz tego, co staramy się uzyskać..
Mówisz: "Wiem (...) mój przypadek użycia jest nadużyciem".
Ale nadużycie oznacza, że istnieje możliwość użycia.
Jednak w twoim przypadku nie ma możliwości użycia, to co "opisałeś" jest niemożliwe, ponieważ to, co jest przekazywane do parsera CSV, musi mieć poprawny format CSV, a twoje nie.
W prawidłowym ciągu CSV większość znaków to informacje, a niektóre znaki są meta-informacjami niezbędnymi do interpretacji ciągu w celu wyodrębnienia informacji.
To, co opisujesz, to to, że chcesz, aby znaki "
należały do kategorii informacji i kategorii meta-informacji łącznie. To tak, jakby ktoś chciał złapać lewą ręką lewą ręką .....
Ten problem występuje z ciągiem znaków, ponieważ nie jest ciągiem pochodzącym z odczytu pliku CSV. Jest to ciąg napisany tak jak jest.
Nie można uzyskać takiego ciągu z odczytu pliku CSV, ponieważ nie można go było zapisać w pliku CSV.
przypadku zapisu do pliku CSV, '"simple|split"|test'
można zapisać
"""simple|split"""|test
z doublequote
ustawiona na True, domyślny
lub #"simple#|split#"|test
z doublequote = False, escapechar = '#'
.
Jeśli chcesz, aby wyodrębnić informacje jak opisałeś, nie trzeba utworzyć parser, trzeba tylko użyć już istniejące narzędzia:
import re
reg = re.compile('".*?"|[^|]+')
print reg.findall('yoo|"simple|split"|test|end"pos|hu')
wynik
['yoo', '"simple|split"', 'test', 'end"pos', 'hu']
Będziesz Muszę napisać własny parser. Cytaty są sposobem na ucieczkę danych, które w innym przypadku nie byłyby postrzegane jako jedna kolumna, a zatem nie są uważane za część danych wyjściowych. –
W zależności od tego, jak skomplikowane są dane, możesz być w stanie oszukać i użyć czegoś okropnego, takiego jak 'filter (None, re.split (r '(". *? ") | \ |', S))' - lub w 'pyparsing' –
Witam, napisałem odpowiedź, w której w rzeczywistości rozwijam to, co powiedzieli Martjin i Jon. Czy mógłbyś powiedzieć, dlaczego nie myślałeś o użyciu wyrażenia regularnego? – eyquem