2009-10-10 19 views
11

Tôi đang sử dụng thư viện CSV của Ruby để phân tích cú pháp một số CSV. Tôi có một tệp CSV dường như được định dạng mà tôi đã tạo bằng cách xuất tệp Excel dưới dạng CSV.Ruby: không thể phân tích cú pháp tệp Excel được xuất dưới dạng CSV trong OS X

Tuy nhiên CSV.open(filename, 'r') gây ra CSV::IllegalFormatError.

Không có dấu phẩy hoặc dấu ngoặc kép trong tệp hoặc bất kỳ thứ gì khác mà tôi có thể thấy có thể gây ra sự cố.

Tôi nghi ngờ vấn đề có thể liên quan đến kết thúc dòng. Tôi có thể phân tích cú pháp dữ liệu được nhập theo cách thủ công thông qua trình chỉnh sửa văn bản (Aquamac). Nó chỉ là khi tôi thử với dữ liệu được xuất từ ​​Excel (đối với OS X) mà vấn đề xảy ra. Khi tôi mở CSV đã xuất trong vim, tất cả văn bản xuất hiện trên một dòng, với ^M xuất hiện giữa các dòng.

Từ tài liệu, có vẻ như bạn có thể cung cấp open với dấu tách hàng; tuy nhiên tôi không chắc nó nên là gì trong trường hợp này.

Trả lời

35

Hãy thử: CSV.open('filename', 'r', ?,, ?\r)

Như cantlin ghi chú, cho Ruby 2 đó là:

CSV.new('file.csv', 'r', :col_sep => ?,, :row_sep => ?\r) 

Tôi chắc rằng chúng sẽ DTRT cho bạn. Bạn cũng có thể "sửa" chính tệp đó (trong trường hợp này giữ nguyên số open) sau đây với vim lệnh sau: :%s/\r/\r/g

Vâng, tôi biết lệnh đó trông giống như tổng số không có, nhưng nó sẽ hoạt động.

+0

cảm ơn rất nhiều - ước gì tôi có thể upvoted bạn hai lần cho hai bit thông tin hữu ích. – grifaton

+0

Bạn có thể làm rõ những gì '? ,,? \ R' đang làm? Cảm ơn! –

+0

? X trả về điểm mã cho ký tự x, tức là một số. Vì lý do nào đó, đó là những gì CSV.open hy vọng sẽ thấy. Vì vậy, chúng tôi xác định phân tách trường là ',' và dấu phân tách bản ghi là^M khác, còn gọi là 015, aka 13, còn gọi là CR. BTW, lệnh thay thế vim hoạt động vì '\ r' có nghĩa là CR trong mẫu nhưng NL thay thế, vì vậy nó không thực sự là một no-op. – DigitalRoss

0

""" Khi tôi mở ra CSV xuất khẩu trong vim, tất cả các văn bản xuất hiện trên cùng một dòng, với^M xuất hiện giữa các dòng.

Từ các tài liệu, có vẻ như bạn có thể cung cấp mở với một phân cách hàng, tuy nhiên tôi không chắc chắn nên có gì trong trường hợp này. "" "

Đọc lại câu ...^M có nghĩa là bàn phím Ctrl-M còn gọi là '\ x0D' (M là chữ cái thứ 13 của ASCII bảng chữ cái; 0x0D == 13) aka ASCII CR (vận chuyển trở lại) aka '\ r' ... IOW những gì Mac được sử dụng như một terminator dòng trước khi OS X.

4

Một tùy chọn khác là mở tệp CSV hoặc bảng tính gốc trong Excel và lưu nó dưới dạng "Windows Comma Separated" thay vì "Comma Separated Values". Điều này sẽ xuất ra tệp với các kết thúc dòng mà FasterCSV có thể hiểu được.

+0

Đã lãng phí một giờ đồng hồ này, cảm ơn một tấn! – Joelio

5

Tước r ký tự \ dường như làm việc cho tôi

CSV.parse(File.read('filename').gsub(/\r/, ' ')) do |row| 
    ... 
end 
0

Có vẻ như phiên bản mới của bộ phân tích CSV và/hoặc bất kỳ thành phần nó sử dụng đọc dòng cuối của hệ điều hành DOS/Windows mà không vấn đề. Mac OS X của một cổ phiếu (không chắc chắn phiên bản) đã không cắt nó, cài đặt Ruby 2.0.0 và nó phân tích cú pháp các tập tin tốt, mà không có các đối số đặc biệt ...

0

Tôi đã có vấn đề tương tự. Tôi gặp lỗi:

"error_message"=>"Illegal quoting in line 1.", "error_class"=>"CSV::MalformedCSVError" 

Vấn đề là tệp có đuôi dòng Windows, tất nhiên là ngoài Unix.Điều đã giúp tôi xác định row_sep: "\ r \ n":

CSV.open(path, 'w', headers: :first_row, col_sep: ';', quote_char: '"', row_sep: "\r\n") 
Các vấn đề liên quan