2016-02-25 78 views
-1

我正在尝试读取CSV,并且一旦遇到CSV中的箭头,Ruby就停止读取。箭头应该是撇号。我无法用CSV替换它,因为当我复制并粘贴时,我会粘贴一个空格。read CSV撇号

我试图使用CSV.foreach或File.open,然后阅读each_line。两种方法都有同样的问题。

在文本编辑器中,字符是黑色的SUB。

我该如何解决这个问题?

CSV.foreach(filename) do |row| 
puts row 
end 

File.open(filename, "r") do |f| 
f.each_line do |row|  
    puts row 
end 
end 

enter image description here

+0

这是一个编码问题。您需要了解什么是原始文件编码,然后在将此文件加载到CSV时明确设置了此编码。 – mudasobwa

+1

你可以发布CSV的样本吗? –

回答

2

如果你的文件没有编码红宝石希望通过默认的方式,你需要手动当你调用foreach指定编码,这将是这样的:

CSV.foreach(filename, encoding: Encoding::UTF_8) 

如果你不确定文件是如何编码的,你可以使用String#encode作为一个非常重的锤子来清除它,尽管你在这个过程中会丢失一些字符。

File.read(filename).encode(
    Encoding::UTF_8, 
    undef: :replace, 
    invalid: :replace, 
    replace: '' 
) 

这表示如果字符未定义或无效,请替换它,并将其替换为空字符串。当然,你可以调整选项来获得你想要的结果。

+0

谢谢。有效。 CSV.foreach(filename,encoding:'iso-8859-1:utf-8') – JXU

+0

我会尝试替换未定义的字符,因为在ruby处理它之后,我将使用另一个软件(STATA)来分析数据,同样的问题来处理这些字符。 – JXU