读取文件提前结束?
我遇到了一个奇怪的事情,文件中的一行导致我的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”。
在下面一行中,它出现在cr
和me
之间,在第一行的末尾:
"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)
- Regexp.last_match线程安全吗?
- 引用CSV输出中的所有字段
- 无法加载此类文件 – mysql2 / 2.4 / mysql2(LoadError) – windows
- 使用Ruby on Rails设计 – 强制用户在首次登录时更改密码
- custom_require.rb:36:在`require’中:没有要加载的文件 – myapp(LoadError)
- 注册和登录时,nil的未定义方法`username’:NilClass
- DateTime到NSDate
- Rally Ruby工具包:如何获取Portfolio Item状态的URL?
- 如何使用ActiveSupport :: Configurable with Rails Engine