读取文件提前结束?

时间:2014-06-27 11:49:10

标签: ruby

我遇到了一个奇怪的事情,文件中的一行导致我的Ruby脚本提前完成读取文件。

我的代码是:

File.readlines($file).each do |line|
    puts "line is: "+line.to_s
    line.each_byte do |c|
        if(c == 9 || c==10 || c==13 || (c>31 && c < 127))
            print c.chr
        end
    end
end

我使用的文件有这个单个字符,在Notepad ++和Sublime Text 2中显示为&#34; SUB&#34;。

在以下行中,它出现在第一行末尾的crme之间:

"ProductToken","estee-lauder-re-nutriv-replenishing-comfort-eye-crme-15ml"
"ProductToken","estee-lauder-youth-dew-body-satinee-150ml"

我有相同的行in my dropbox

当我执行上面的示例脚本时,它会命中该角色,然后完成。我怀疑是File方法将该字符视为文件的结尾。

问题在于我完全不知道如何解决这个问题。我可以在Sublime中进行查找和替换,或者可能使用sed或其他东西,但我不想每次都这样做。

我在Windows上使用Ruby 1.9.3。

我可以使用文件编码吗?我不知道文件编码是什么,更不用说如何处理它了。

此外,原始readline函数是获取该CSV文件的内容,解析它,然后将其粘贴到哈希中。 原始文件大小约为28mb,数据库中有超过350k的独特行,所以当我检查散列的大小并发现它只有2100长时,这使我开始研究这个。


根据要求,我在Mac上通过od -c运行它,并获得以下内容:

0000000    "   P   r   o   d   u   c   t   T   o   k   e   n   "   ,   "  
0000020    e   s   t   e   e   -   l   a   u   d   e   r   -   r   e   -  
0000040    n   u   t   r   i   v   -   r   e   p   l   e   n   i   s   h  
0000060    i   n   g   -   c   o   m   f   o   r   t   -   e   y   e   -  
0000100    c   r 032   m   e   -   1   5   m   l   "  \n   "   P   r   o  
0000120    d   u   c   t   T   o   k   e   n   "   ,   "   e   s   t   e  
0000140    e   -   l   a   u   d   e   r   -   y   o   u   t   h   -   d  
0000160    e   w   -   b   o   d   y   -   s   a   t   i   n   e   e   -  
0000200    1   5   0   m   l   "  \n                                      
0000207  

http://blob.perl.org/books/beginning-perl/3145_AppF.pdf

根据这个,在八进制中,032实际上是一个SUB字符。 在这种情况下,如果它是一个有效的ASCII字符,为什么Ruby会认为它是一个文件结尾?

1 个答案:

答案 0 :(得分:1)

您可以使用File#read来绕过此问题,它允许您指定要读取的正确字节数。

File.open($file) do |f|
  f.read(f.size).each_line do |line|
    # ...
  end
end

甚至更好,因为您的数据是CSV,您可以使用csv lib,它也读取 Ctrl + Z

require 'csv'
rows = CSV.read($file)