Ruby/Rails CSV 解析,UTF-8 中的无效字节序列

Posted

技术标签:

【中文标题】Ruby/Rails CSV 解析,UTF-8 中的无效字节序列【英文标题】:Ruby/Rails CSV parsing, invalid byte sequence in UTF-8 【发布时间】:2012-01-12 21:16:24 【问题描述】:

我正在尝试解析从 Excel 电子表格生成的 CSV 文件。

这是我的代码

require 'csv'
file = File.open("input_file")
csv = CSV.parse(file)

但我得到了这个错误

ArgumentError: invalid byte sequence in UTF-8

我认为错误是因为 Excel 将文件编码为 ISO 8859-1 (Latin-1) 而不是 UTF-8

有人可以帮我解决这个问题吗

提前致谢。

【问题讨论】:

最好的解决办法是让excel编码成utf-8 如果您需要支持各种编码并在导入时检测,Charlock Holmes 非常适合我。见***.com/a/12234195/1343535 【参考方案1】:

如果您只有一个(或几个)文件,那么当不需要对您从输入中获得的任何文件自动声明编码时,您可以在纯文本(txt、csv 等)中看到此文件的内容即分号,您可以手动创建带有.csv 扩展名的新文件,并将文件内容粘贴到那里,然后像往常一样解析内容。

请记住,这是一种解决方法,但只需要在 linux 中解析一个大的 excel 文件,转换为某种形式的 csv,它就可以腾出时间来尝试所有这些花哨的编码

【讨论】:

【参考方案2】:

使用 encoding 选项指定编码:

CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
  ...
end

【讨论】:

我更喜欢为encoding:明确声明关键字参数+1【参考方案3】:

您需要告诉 Ruby 该文件在 ISO-8859-1 中。将您的文件打开行更改为:

file=File.open("input_file", "r:ISO-8859-1")

第二个参数告诉 Ruby 以 ISO-8859-1 编码以只读方式打开。

【讨论】:

这也让我很不舒服,到目前为止,您的解决方案对我有效!谢谢! 像冠军一样工作。在我找到这个答案之前,我正在做一个iconv -f ISO-8859-1 -t utf-8 oldfilename > newfilename @jnunn:很高兴我能帮上忙! Ruby 编码很麻烦,处理起来也不是那么容易。 如果您在这里使用 'roo' gem,这里的文档:github.com/roo-rb/roo#csv-support 说您可以将其作为符号发送:s = Roo::CSV.new("mycsv.csv", csv_options: encoding: Encoding::ISO_8859_1)【参考方案4】:

我遇到了同样的问题,只是使用谷歌电子表格,然后下载为 CSV。那是最简单的解决方案。

然后我遇到了这个宝石

https://github.com/single***/utf8-cleaner

现在我完全不用担心这个问题了。希望这会有所帮助!

【讨论】:

【参考方案5】:

将第二个参数 "r:ISO-8859-1" 添加为 File.open("input_file","r:ISO-8859-1" )

【讨论】:

【参考方案6】:

以 utf-8 格式保存文件,除非由于某种原因需要以不同方式保存,在这种情况下,您可以在读取文件时指定编码集

【讨论】:

【参考方案7】:

您可以直接在文件模式参数中提供源编码:

CSV.foreach( "file.csv", "r:windows-1250" ) do |row|
   <your code>
end

【讨论】:

这在 Ruby 2.1.5 中有效,但您必须使用 encoding: 'iso-8859-1' 而不是 "r:windows-1250"

以上是关于Ruby/Rails CSV 解析,UTF-8 中的无效字节序列的主要内容,如果未能解决你的问题,请参考以下文章

在Ruby / Rails中解析Atom和RSS?

ruby Rails4で简CSV CSVダウンロードref:http://qiita.com/oharato/items/414b7e5a61034bf8311c

清理 URL slug 的 Unicode 字符串(Ruby/Rails)

ruby编程中异常处理的实践解析

如何使用ruby / rails将所有大写字母转换为适当的首字母大写字母,其余为小写?

ruby Rails - Rails中用于菜单链接的简单“活动”类