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

时间:2011-12-05 01:31:48

标签: ruby-on-rails ruby csv utf-8

我正在尝试解析从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

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

提前致谢。

7 个答案:

答案 0 :(得分:64)

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

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

第二个参数告诉Ruby使用编码ISO-8859-1打开只读。

答案 1 :(得分:15)

使用 encoding 选项指定编码:

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

答案 2 :(得分:12)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

然后我遇到了这个宝石

https://github.com/singlebrook/utf8-cleaner

现在我根本不需要担心这个问题。希望这有帮助!

答案 6 :(得分:0)

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

请记住,这是一种解决方法,但是只需要在linux中解析一个大的excel文件,并将其转换为某种形式的csv,就可以节省时间尝试所有这些奇特的编码