在Ruby中读取文本文件会产生错误的输出

时间:2013-12-02 06:00:01

标签: ruby

我不是一位经验丰富的红宝石程序员,所以请耐心等待。我对这个包含两行的特定文本文件有疑问(此问题仅在某些情况下出现):

trim(0, 15447)
0, 15447

我正在尝试使用以下代码阅读这两行:

File.open(trim).each do |line|
   puts line
end

我通常会获得正常输出,但在这里,我只得到一行,但缺少一些字符:

0, 1544715447)

如果我想查看字符代码,我明白了:

irb(main):120:0> File.open(trim).each do |line|
irb(main):121:1* puts '========================'
irb(main):122:1> puts line
irb(main):123:1> puts '........................'
irb(main):124:1> puts line.each_byte {|c| print c, ' ' }
irb(main):125:1> end
========================
0, 1544715447)
........................
116 114 105 109 40 48 44 32 49 53 52 52 55 41 13 48 44 32 49 53 52 52 55 trim(0,0, 15447
=> #<File:E:\Public\Public_videos\Soccer\1995_0129_odp_es\950129-ODP_&m3_trim30.txt>

我坦率地不明白发生了什么,因为我没有看到任何隐藏的角色,这种情况随机发生,但与某些文件一致。 任何帮助我理解或避免这个问题的建议都将不胜感激。

1 个答案:

答案 0 :(得分:3)

发生的事情是你的文件有两条“线”,被一个carraige返回字符分隔,而不是一个换行符。

您将文件中的字节显示为

116 114 105 109 40 48 44 32 49 53 52 52 55 41 13 48 44 32 49 53 52 52 55

这是一个回车,有时由作者“显示”回到它正在写的行的开头。

首先它写出来

trim(0, 15447)

然后它回到相同的行的开头并写了

0, 15447

覆盖初始线!你最终得到了什么?

0, 1544715447)

您的“问题”可能最好通过重新编码您的文本文件来使用更好的方法来分隔行。在Unix系统上,包括现在的OSX,行终止符是字符10 - 称为LINE FEED。 Windows使用双字符组合13 10(CR LF)。据我所知,只有旧的Mac系统使用了13。

今天许多文本编辑器允许您选择“行结束”选项,因此您可以只打开该文件,然后使用不同的行结束选项保存它。 FWIW我的猜测是你现在正在使用Windows,它以比*​​ Nix系统不同的方式呈现CR和LF。