读取文件提前结束?

我遇到了一个奇怪的事情,文件中的一行导致我的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中显示为“SUB”。

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

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

我的Dropbox中有相同的行。

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

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

我在Windows上使用Ruby 1.9.3。

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

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


根据要求,我在Mac上通过od -c运行它,并得到以下信息:

 0000000 " P roduct T oken " , " 0000020 estee - lauder - re - 0000040 nutriv - replenish 0000060 ing - comfort - eye - 0000100 cr 032 me - 1 5 ml " \n " P ro 0000120 duct T oken " , " este 0000140 e - lauder - youth - d 0000160 ew - body - satinee - 0000200 1 5 0 ml " \n 0000207 

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

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

您可以使用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)