Ruby / Rails 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

有人可以帮我解决此问题的方法吗

提前致谢。

rogeliog asked 2020-08-10T15:53:35Z
7个解决方案
65 votes

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

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

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

Linuxios answered 2020-08-10T15:53:49Z
16 votes

使用encoding选项指定编码:

CSV.foreach(file.path, headers: true, encoding:'iso-8859-1:utf-8') do |row|
  ...
end
Sudhir Vishwakarma answered 2020-08-10T15:54:09Z
12 votes

您可以直接在file mode参数中提供源编码:

CSV.foreach( "file.csv", "r:windows-1250" ) do |row|
   <your code>
end
kixorz answered 2020-08-10T15:54:29Z
0 votes

将文件保存在utf-8中,除非出于某种原因需要另外保存,否则在读取文件时可以指定编码集

Eliza A answered 2020-08-10T15:54:49Z
0 votes

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

Gagan Gami answered 2020-08-10T15:55:09Z
0 votes

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

然后我遇到了这个宝石

[HTTPS://GitHub.com/single Brook/UTF8-cleaner]

现在,我完全不必担心这个问题。 希望这可以帮助!

user3787971 answered 2020-08-10T15:55:43Z
0 votes

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

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

ToTenMilan answered 2020-08-10T15:56:08Z
translate from https://stackoverflow.com:/questions/8380113/ruby-rails-csv-parsing-invalid-byte-sequence-in-utf-8