2014-06-17 43 views
2

我想解析上傳的CSV文件。下面是完整的錯誤消息:無法解析CSV文件 - 「CSV :: MalformedCSVError:未加引號的字段不允許 r或 n」

[Worker(host:PC.local pid:69594)] Job ImportJob (id=4) FAILED (3 prior attempts) with CSV::MalformedCSVError: Unquoted fields do not allow \r or \n (line 1). 

而且CSV文件看起來是這樣的:

A1;A2;A3;A4;A5 
B1;B2;B3;B4;B5 
C1;C2;C3;C4;C5 

這就是我如何遍歷CSV文件中的數據:

data = SmarterCSV.process(
    file, 
    { 
    :col_sep => ';', 
    :chunk_size => 100, 
    :remove_empty_values => false, 
    :remove_empty_hashes => false 
    } 
) do |d| 

什麼這裏的問題?我試圖把標題放到文件中,甚至試圖刪除它(上面的版本),但在這兩種情況下,我都會得到相同的錯誤。我如何擺脫它?

+0

是你的工作是什麼機器(?視窗Mac)的那臺機器上創建的文件? –

+0

Mac。我從一個XLS文件(可能是在Windows上創建的)創建了CSV文件。 – user984621

+1

我已經看到一些類似於從MS Excel導出的CSV文件。爲了解決它,我基本上只是做了一個'gsub'來換出任何回車。 –

回答

3

假設CSV文件是在Windows上創建的,行結尾是「\ r \ n」並不奇怪。儘量明確使你的行分隔符:

:row_sep => "\r" 

全部放在一起:

data = SmarterCSV.process(file, 
    :col_sep => ';', 
    :row_sep => "\r", 
    :chunk_size => 100, 
    :remove_empty_values => false, 
    :remove_empty_hashes => false) do |d| 
+0

不幸的是,仍然是相同的錯誤(即使重新啓動應用程序沒有幫助)。 – user984621

+1

怎麼做row_sep'\ r \ n'? –

1

我遇到了這個確切的問題,但與內置的CSV模塊。

我解決它通過使用IO讀取模式的文字:「RT」,而不是「R」:

require 'csv' 

CSV.open(file_name, 'rt').each do |row| 
    # blah, blah 
end