水晶从文件的n行到n行

时间:2018-07-18 11:20:41

标签: crystal-lang

如何获取文件中的特定行并将其添加到数组中?

例如:我想获得200-300行并将其放入数组中。并同时计算文件中的总行数。该文件可能很大。

2 个答案:

答案 0 :(得分:5)

File.each_line是一个很好的参考,但是返回迭代器的变量不是最佳的,因为它留下了打开的文件描述符。该方法可能会被删除。

但是,此方法的yield变量对此有好处:

lines = [] of String
index = 0
range = 200..300

File.each_line(file, chomp: true) do |line|
  index += 1
  if range.includes?(index) 
    lines << line
  end
end

现在lines保留range中的行,而index是文件中的总行数。

答案 1 :(得分:2)

要防止读取整个文件并为其所有内容分配新数组,可以使用File.each_line迭代器:

lines = [] of String

File.each_line(file, chomp: true).with_index(1) do |line, idx|
  case idx
  when 1...200  then next          # ommit lines before line 200 (note exclusive range)
  when 200..300 then lines << line # collect lines 200-300
  else break                       # early break, to be efficient
  end
end