我遇到了一个奇怪的事情,文件中的一行导致我的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;。
在以下行中,它出现在第一行末尾的cr
和me
之间:
"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会认为它是一个文件结尾?
答案 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)