文件中的Ruby Count行包括最后一行(空)

时间:2015-02-11 06:44:55

标签: ruby file io eof

我正在尝试使用ruby来计算文件的行数,但我无法让IOFile计算最后一行。 我最后一行是什么意思? 这是Atom编辑器获取最后一行的屏幕截图 enter image description here

Ruby返回20行,我需要21行。这是这样的文件 https://copy.com/cJbiAS4wxjsc9lWI

2 个答案:

答案 0 :(得分:2)

有趣的问题(虽然您的示例文件很麻烦)。您的编辑器显示第21行,因为第20行结束并带有换行符。如果没有尾随的换行符,编辑器将显示20行。

这是一个更简单的例子:

a = "foo\nbar"
b = "baz\nqux\n"

文本编辑器会显示:

# file a
1 foo
2 bar

# file b
1 baz
2 qux
3
然而,在任何一种情况下,Ruby都会看到2行:

a.lines       #=> ["foo\n", "bar"]
a.lines.count #=> 2

b.lines       #=> ["baz\n", "qux\n"]
b.lines.count #=> 2

您可以通过添加任意字符来欺骗Ruby识别尾随换行符:

(a + '_').lines       #=> ["foo\n", "bar_"]
(a + '_').lines.count #=> 2

(b + '_').lines       #=> ["baz\n", "qux\n", "_"]
(b + '_').lines.count #=> 3

或者您可以使用匹配行尾(Regexp)或字符串结尾($)的\Z

a.scan(/$|\Z/)       #=> ["", ""]
a.scan(/$|\Z/).count #=> 2

b.scan(/$|\Z/)       #=> ["", "", ""]
b.scan(/$|\Z/).count #=> 3

答案 1 :(得分:1)

Ruby lines方法不计算最后一个空行。 要欺骗,您可以在流的末尾添加任意字符。

Ruby lines为此示例返回2行:

1 Hello
2 World
3 

相反,它在这种情况下返回3行

1 Hello
2 World
3 *