2009-10-10 70 views
11

我正在使用Ruby的CSV庫來解析某些CSV。我有一個看似格式良好的CSV文件,我通過將Excel文件導出爲CSV來創建。Ruby:無法解析在OS X中導出爲CSV格式的Excel文件

但是CSV.open(filename, 'r')導致CSV::IllegalFormatError

該文件中沒有流氓逗號或引號,也沒有其他任何可以看到可能導致問題的內容。

我懷疑問題可能是與行結束有關。我能夠解析通過文本編輯器(Aquamacs)手動輸入的數據。正是當我嘗試從Excel(用於OS X)導出的數據出現問題時。當我在vim中打開導出的CSV文件時,所有文本都出現在一行上,並在行之間出現^M

從文檔看來,您似乎可以爲open提供行分隔符;但我不確定在這種情況下應該如何。

回答

35

嘗試:CSV.open('filename', 'r', ?,, ?\r)

由於cantlin筆記,爲Ruby 2是:

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

我敢肯定,這將DTRT爲您服務。你也可以用下面的命令vim「修復」文件本身(在這種情況下,保留舊open)::%s/\r/\r/g

是的,我知道,命令看起來像一個總空操作,但它會奏效。

+0

非常感謝 - 希望我可以爲你提供兩次有用的信息。 – grifaton

+0

你能澄清一下'?,?\ r'在做什麼嗎?謝謝! –

+0

?x返回字符x的代碼點,即一個數字。出於某種原因,這就是CSV.open期望看到的。因此,我們將字段分隔符指定爲',',將記錄分隔符指定爲否則麻煩的^ M,又名015,又名13,又名CR。順便說一句,vim替代命令的工作原理是因爲'\ r'表示模式中的CR,而替換中的NL,所以它實際上並不是一個空操作。 – DigitalRoss

0

「」」 當我在vim打開導出CSV,所有的文字出現在一行中,與線之間的^ M出現。

從文檔,似乎可以爲用戶提供一個開放行分隔符;但是我不確定它在這種情況下應該是什麼 「」「

回讀一個句子......^M表示鍵盤Ctrl-M又名'\ x0D'(M是第13個字母ASCII字母; 0x0D == 13)aka ASCII CR(回車)aka'\ r'... IOW在OS X之前用作行終止符的Mac。

4

另一種選擇是在Excel中打開CSV文件或原始電子表格,並將其另存爲「Windows逗號分隔」而不是「逗號分隔值」。這將輸出帶有FasterCSV能夠理解的行尾的文件。

+0

在這一個上浪費了一個小時,謝謝! – Joelio

5

剝離\ r字符似乎爲我

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

工作看來CSV解析器和/或它使用沒有問題讀DOS/Windows行結尾的任何組件的更新版本。 Mac OS X的股票之一(不知道版本)沒有削減它,安裝Ruby 2.0.0,它解析文件就好了,沒有特殊的參數...

0

我有類似的問題。我得到一個錯誤:

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

問題是文件有Windows行結束,這當然不是Unix。什麼幫助我定義row_sep:「\ r \ n」:

CSV.open(path, 'w', headers: :first_row, col_sep: ';', quote_char: '"', row_sep: "\r\n")