Ruby:无法解析在OS X中导出为CSV的Excel文件

时间:2009-10-10 21:40:25

标签: ruby macos csv

我正在使用Ruby的CSV库来解析一些CSV。我有一个看似格式正确的CSV文件,我通过将Excel文件导出为CSV来创建。

CSV.open(filename, 'r')导致CSV::IllegalFormatError

文件中没有流氓逗号或引号,也没有任何我可以看到的可能导致问题的内容。

我怀疑问题可能与行结尾有关。我能够解析通过文本编辑器(Aquamacs)手动输入的数据。就在我尝试从Excel(OS X)导出的数据时,会出现问题。当我在vim中打开导出的CSV时,所有文本都显示在一行上,行之间出现^M

从文档中,您似乎可以为open提供行分隔符;但我不确定在这种情况下应该是什么。

6 个答案:

答案 0 :(得分:35)

尝试:CSV.open('filename', 'r', ?,, ?\r)

正如cantlin所指出的,对于Ruby 2来说,它是:

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

我很确定这些会为您提供DTRT。您还可以使用以下open命令“修复”文件本身(在这种情况下保留旧版vim)::%s/\r/\r/g

是的,我知道这个命令看起来像一个完全无操作,但它会起作用。

答案 1 :(得分:5)

剥离\ r \ n字符似​​乎对我有用

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

答案 2 :(得分:4)

另一个选项是在Excel中打开CSV文件或原始电子表格,并将其另存为“Windows逗号分隔”而不是“逗号分隔值”。这将输出FasterCSV能够理解的行结尾的文件。

答案 3 :(得分:0)

“”” 当我在vim中打开导出的CSV时,所有文本都显示在一行上,行之间出现^ M.

从文档中,似乎可以提供open行分隔符;但我不确定在这种情况下应该是什么。 “”“

回读一个句子...... ^ M表示键盘Ctrl-M又名'\ x0D'(M是ASCII字母表的第13个字母; 0x0D == 13)aka ASCII CR(回车)又名'\ r' ... IOW在OS X之前Macs曾经用作线路终结器。

答案 4 :(得分:0)

似乎较新版本的CSV解析器和/或它使用的任何组件都没有问题地读取DOS / Windows行结尾。 Mac OS X的库存(不确定版本)没有削减它,安装了Ruby 2.0.0并且它解析了文件就好了,没有特殊的参数......

答案 5 :(得分: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")