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 Rails4で简CSV CSVダウンロードref:http://qiita.com/oharato/items/414b7e5a61034bf8311c
清理 URL slug 的 Unicode 字符串(Ruby/Rails)