2009-11-27 10 views
15

Znalazłem problem z analizą CSV w FasterCSV (1.5.0), który wydaje się być prawdziwym błędem, ale mam nadzieję, że istnieje obejście tego problemu.Przezwyciężenie podstawowego problemu z parsowaniem CSV za pomocą klejnotu FasterCSV

Zasadniczo, dodanie spacji po separatorze (w moim przypadku przecinka), gdy pola są ujęte w cudzysłowy, generuje MalformedCSVError.

Oto prosty przykład:

# No quotes on fields -- works fine 
FasterCSV.parse_line("one,two,three") 
=> ["one", "two", "three"] 

# Quotes around fields with no spaces after separators -- works fine 
FasterCSV.parse_line("\"one\",\"two\",\"three\"") 
=> ["one", "two", "three"] 

# Quotes around fields but with a space after the first separator -- fails! 
FasterCSV.parse_line("\"one\", \"two\",\"three\"") 
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1. 

będę zły, czy jest to błąd w FasterCSV?

Odpowiedz

14

Tutaj jest poprawna MalformedCSVError.

Miejsca początkowe/końcowe w formacie CSV nie są ignorowane, są uważane za część pola. Oznacza to, że uruchomiłeś pole z spacją, a następnie włączyłeś nieokreślone podwójne cudzysłowy w tym polu, co spowodowałoby błąd nielegalnego cytowania.

Może ta biblioteka jest po prostu bardziej rygorystyczna niż inne, z których korzystałeś.

+0

Czy to nie spacja mówi, że pole faktycznie nie jest otoczone cudzysłowami (ponieważ pierwszy znak nie jest cudzysłowem) i że cytaty powinny być brane jako część treści pola? –

+1

Wygląda na to, że się mylę. "Jeśli pola nie są ujęte w cudzysłowy, cudzysłowy mogą nie pojawiać się w polach." - http://tools.ietf.org/html/rfc4180#section-2 –

+0

Masz rację, nie zdawałem sobie sprawy, że istnieje "specyfikacja" dla CSV, ale wygląda na to, że tak jest. FasterCSV jest rzeczywiście bardzo surowy. – Olly

2

Być może mógłbyś ustawić opcję: col_sep: opcja na ',', aby sparsować takie pliki.

2

Miałem nadzieję, że opcja :col_sep może zezwolić na wyrażenie regularne, ale wydaje się być używana zarówno do czytania, jak i pisania, co jest hańbą. documentation nie trzymać się wiele nadziei, a zapotrzebowanie jest prawdopodobnie bardziej bezpośredni niż mógłby być spełniony poprzez żądanie zmiany lub złożenie poprawki ;-)

Jeśli dzwonisz #parse_line wyraźnie, wtedy zawsze można zadzwonić

gsub(/,\s*/, ',') 

na linii wejściowej. To wyrażenie regularne może wymagać znacznej zmiany, jeśli przewiduje się możliwość przecinków w cytowanych ciągach. (Sugerowałbym, żeby tutaj zamieścić takie pytanie za pomocą odpowiedniego znacznika i pozwolić, żeby w tym przypadku luki RegEx były luźne).

Powiązane problemy