2015-02-11 57 views
0

我想算红宝石文件的行,但我不能让任何IOFile计数的最后一行。 最后一行是什么意思? 下面是Atom编辑器获取最后一行的截图: enter image description here红宝石计数在文件中的行,包括最后一行(空)

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

+1

你可以发布你是如何计算的行数3行? – shivam 2015-02-11 06:52:04

+0

你可以简单地加1('File.foreach(“file.txt的”)。算上+ 1')匹配的文本编辑器的最后一个行号。 – cremno 2015-02-11 07:21:10

+0

没有21号线。你在编辑器中看到的第21条线是20年代末的'\ n'。所以,正确的答案是:这个文件中有20行。 – 2015-02-11 07:44:41

回答

2

有趣的问题(虽然你的例子文件是繁琐的)。你的编辑器将显示一个21线,因为20日线结束有一个换行符。如果没有结尾的换行符,编辑器将显示20行。

这里有一个简单的例子:

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

一个文本编辑器会显示:但是

# file a 
1 foo 
2 bar 

# file b 
1 baz 
2 qux 
3 

红宝石看到2号线在两种情况下:

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

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

你可以欺骗红宝石成通过添加任意的字符识别其后的换行符:

(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 
+0

令人敬畏的答复,谢谢! – acrogenesis 2015-02-11 15:27:09

1

红宝石lines方法没有算上最后的空行。 欺骗,你可以在你流的末尾添加一个任意字符。

红宝石lines返回2线这个例子:

1 Hello 
2 World 
3 

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

1 Hello 
2 World 
3 *