【问题标题】:Ruby: cannot parse Excel file exported as CSV in OS XRuby:无法解析在 OS X 中导出为 CSV 的 Excel 文件
【发布时间】:2010-12-05 16:03:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby macos csv


    【解决方案1】:

    我有类似的问题。我收到一个错误:

    "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") 
    

    【讨论】:

      【解决方案2】:

      试试: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

      是的,我知道该命令看起来完全没有操作,但它会起作用。

      【讨论】:

      • 非常感谢 - 希望我能为您提供两次有用的信息。
      • 你能澄清?,, ?\r在做什么吗?谢谢!
      • ?x 返回字符 x 的代码点,即一个数字。出于某种原因,这就是 CSV.open 期望看到的。因此,我们将字段分隔符指定为,,将记录分隔符指定为其他麻烦的^M,即015,又名13,又名CR。顺便说一句,vim 替换命令有效,因为\r 在模式中表示 CR,但在替换中表示 NL,所以它实际上不是空操作。
      • 感谢您,非常有帮助。请注意,CSV 构造函数签名自 Ruby 1.9.2 起已更改,上面的用法将是 CSV.new('file.csv', 'r', :col_sep => ?,, :row_sep => ?\r)
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            """ 当我在 vim 中打开导出的 CSV 时,所有文本都出现在一行中,^M 出现在行之间。

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

            读回一个句子 ... ^M 表示键盘 Ctrl-M 又名 '\x0D'(M 是 ASCII 字母表的第 13 个字母;0x0D == 13)又名 ASCII CR(回车)又名 '\r' ... IOW 什么 Mac 在 OS X 之前用作行终止符。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-07-01
              • 2013-05-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多