Ruby 使用度符号对CSV进行正确编码

Ruby 使用度符号对CSV进行正确编码,ruby,csv,encoding,Ruby,Csv,Encoding,我需要解析一个CSV文件,该文件在头中包含学位符号(°)。如果我尝试打开该文件: CSV.foreach('myfile.csv', headers: true) do |row| ... end 我在UTF-8(ArgumentError)中获得了无效的字节序列。所以我尝试了一些其他编码(ISO-8859-1和ASCII-8BIT),但我总是得到一个CSV::malformedcsvror错误 我应该指定哪种编码才能读取文件 实际上,我不关心学位符号,因此它对我来说也是一个简单忽略它的解

我需要解析一个CSV文件,该文件在头中包含学位符号(
°
)。如果我尝试打开该文件:

CSV.foreach('myfile.csv', headers: true) do |row|
  ...
end
我在UTF-8(ArgumentError)中获得了无效的字节序列。所以我尝试了一些其他编码(ISO-8859-1和ASCII-8BIT),但我总是得到一个
CSV::malformedcsvror
错误

我应该指定哪种编码才能读取文件


实际上,我不关心学位符号,因此它对我来说也是一个简单忽略它的解决方案(例如,返回
'Tx1 C'
而不是
'Tx1°C'
)。

解析外部文件的默认编码是UTF-8(
encoding.default\u external
)。但是,CSV文件不存储在UTF-8中。当Ruby尝试使用UTF-8编码解析非UTF-8编码的字节序列时,如果两种编码不兼容,就会出现错误

您应该首先获得CSV文件的实际编码。这可以通过在Notepad++中打开CSV文件并选中
编码
菜单下的选项来确定。其他一些文本编辑器也有类似的实用程序,如VIM、UltraEditor

假设您发现CSV文件的实际编码是
GBK
,请将代码重写为

CSV.foreach('myfile.csv', headers: true, encoding: 'GBK') do |row|
 ...
end

你可以在打开它之前拿出一个过程来移除这些小恶魔:

system("LANG=C tr -d '\260' < myfile.csv >> $$.tmp && mv $$.tmp myfile.csv")
如果您以Windows为目标,则
tr
命令将不起作用,您可能需要执行以下操作以删除第一行:

more +1 unhappy.csv > happy.csv

请注意,
more
的限制是65535行。

仔细查看。这可能会对您有所帮助。如果您在Ruby中读取字符串(CSV例程之外)没有问题,那么您可以在使用CSV读取之前删除所有
°
符号。编码实际上是
iso-8859-1
MacBook Pro:sonde sig$文件-I QLd01haqJ00Kn.CSV QLd01haqJ00Kn.CSV:text/plain;charset=iso-8859-1
但正如我前面提到的,当我指定该编码时,我得到的是
CSV::malformedcsvrorer
@macsig,那么它是格式错误的指定
行sep:“\r\n”
。即使我不想使用这种方法,错误也已得到解决(因为我在Mac上开发,在Windows上运行生产,我不确定这两个系统是否一致)当我运行
tr-d'\260'
时,我得到
非法字节序列日期;小时;pv11-温度(
之后)(这是学位符号。当然。我理解。对于grins,您可以尝试在命令前面加上“LANG=C”,这样看来,
LANG=C tr-d…
这似乎有效。感谢您的帮助。如果我没有找到任何其他方法,我将在两个系统上尝试您的解决方案,看看我是否可以使用它。祝您愉快。
more +1 unhappy.csv > happy.csv