根据长度读取线条

时间:2013-03-09 23:36:13

标签: ruby string file string-length

我想知道更有效的方法只能根据一定的长度读取文件的字符串。我知道这是一种天真的方法:

len = 3
d = Array.new
t = File.open('d.txt').read
t.each_line do |x|
    #+2 accounting for \n\r
    if x.length == (len + 2)
        d.push(x)
    end
end

2 个答案:

答案 0 :(得分:3)

这与您的代码相同。

d = File.open("d.txt").lines.select{|l| l.chomp.length == len}

答案 1 :(得分:2)

这有很多问题:

len = 3
d = Array.new
t = File.open('d.txt').read
t.each_line do |x|
    #+2 accounting for \n\r
    if x.length == (len + 2)
        d.push(x)
    end
end

首先,由于File.open('d.txt').read整个文件被读入内存,然后使用each_line分割成行,最后捕获所需长度的行。如果文件由1,000,000行组成,并且只有一行是三个字符长,则会浪费很多内存和CPU时间。

相反,请这样写:

len = 3
d = []
File.foreach('d.txt') do |x|
  d << x if (x.chomp.length == len)
end

foreach读取每一行,保持换行符。 chomp删除换行符,以便您可以将chomp的实际行与len的行结果进行比较。read。然后,如果长度匹配,则该行将附加到该数组。除非每行都是所需的长度,否则整个文件都不会在内存中。这样可以节省内存,并且运行速度非常快,甚至可能比使用{{1}}来覆盖整个文件的原始文件更快,因为如果文件足够大,该过程可能需要一段时间。