2009-11-27 22 views
15

Tôi đã tìm thấy vấn đề phân tích cú pháp CSV với FasterCSV (1.5.0), có vẻ như là lỗi chính hãng, nhưng tôi hy vọng có một giải pháp thay thế.Khắc phục sự cố cơ bản với phân tích cú pháp CSV bằng cách sử dụng đá quý FasterCSV

Về cơ bản, thêm dấu cách sau dấu phân cách (trong trường hợp của tôi là dấu phẩy) khi các trường được đính kèm trong dấu ngoặc kép sẽ tạo ra một MalformedCSVError.

Dưới đây là một ví dụ đơn giản:

# 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. 

Am Tôi sẽ điên, hoặc đây là một lỗi trong FasterCSV?

Trả lời

14

MalformedCSVError là chính xác tại đây.

Không gian đầu/cuối ở định dạng CSV không bị bỏ qua, chúng được coi là một phần của trường. Vì vậy, điều này có nghĩa là bạn đã bắt đầu một trường có dấu cách và sau đó bao gồm dấu ngoặc kép không thoát trong trường đó, điều này sẽ gây ra lỗi trích dẫn bất hợp pháp.

Có thể thư viện này chỉ nghiêm ngặt hơn các thư viện khác mà bạn đã sử dụng.

+0

Không phải là không gian nói rằng trường này thực sự không được bao quanh bởi dấu ngoặc kép (vì char đầu tiên không phải là báo giá) và dấu ngoặc kép nên được thực hiện như một phần của nội dung trường? –

+1

Có vẻ như tôi đã sai. "Nếu các trường không kèm theo dấu ngoặc kép, thì dấu ngoặc kép có thể không xuất hiện bên trong các trường". - http://tools.ietf.org/html/rfc4180#section-2 –

+0

Bạn nói đúng, tôi đã không nhận ra có 'spec' cho CSV nhưng có vẻ như có. FasterCSV thực sự rất nghiêm ngặt. – Olly

2

Có thể bạn có thể đặt tùy chọn: col_sep: thành ',' để phân tích cú pháp các tệp như vậy.

2

Tôi đã hy vọng rằng tùy chọn :col_sep có thể cho phép biểu thức chính quy, nhưng dường như nó được sử dụng cho cả đọc và viết, điều này thật đáng tiếc. Các documentation không giữ ra nhiều hy vọng và nhu cầu của bạn có lẽ là nhiều hơn ngay lập tức hơn có thể được thỏa mãn bằng cách yêu cầu một sự thay đổi hoặc nộp một bản vá ;-)

Nếu bạn đang gọi điện thoại #parse_line một cách rõ ràng, sau đó bạn luôn luôn có thể gọi

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

trên dòng nhập liệu của bạn. Biểu thức chính quy đó có thể cần phải thay đổi đáng kể nếu bạn dự đoán khả năng dấu phẩy trong các chuỗi được trích dẫn. (Tôi muốn đề nghị reposting một câu hỏi như vậy ở đây với một thẻ thích hợp và để cho những kẻ xâm lược RegEx rời khỏi nó nên là trường hợp).

Các vấn đề liên quan