我正在尝试解析从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
有人可以帮我解决这个问题吗
提前致谢。
答案 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,就可以节省时间尝试所有这些奇特的编码