如何删除文本文件中的特定行?

时间:2016-05-29 22:19:24

标签: ruby regex rubygems

假设我有一个带有以下文字的 input.txt 文件:

First line
Second line
Third line
Fourth line

我想删除第二行和第四行以获取此信息:

First line
Third line

到目前为止,我已设法使用此代码

仅删除第二行中的一行
require 'fileutils'

File.open('output.txt', 'w') do |out_file|
  File.foreach('input.txt') do |line|
     out_file.puts line unless line =~ /Second/
  end
end

FileUtils.mv('output.txt', 'input.txt')

在Ruby中删除文本文件中多行的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

从文本文件中清晰有效地删除行是很困难的"在一般情况下,如果你可以稍微约束一下这个问题,那么可以很简单。

以下是来自SO的一些提出类似问题的问题:

还有很多其他人。

在您的情况下,如果您的输入文件相对较小,您可以轻松地使用您正在使用的方法。实际上,唯一需要更改以满足您的标准的是修改输入文件循环和条件:

File.open('output.txt', 'w') do |out_file|
  File.foreach('input.txt').with_index do |line,line_number|
     out_file.puts line if line_number.even?  # <== line numbers start at 0
  end
end

更改是使用with_index方法捕获行号,由于File#foreach在没有块的情况下调用Enumerator时返回with_index,因此可以使用该方法。该块现在适用于{ _id: 11111, time:40 } ,并获取行号作为第二个块参数。只需在比较中使用行号,即可获得您指定的条件。

即使对于稍大的文件,这种方法也会扩展,而将整个文件读入内存的解决方案对文件大小的上限相当低。使用此解决方案,您可以更多地受到可用磁盘空间和读取/写入文件的速度的限制;例如,对空间有限的在线存储执行此操作可能不如您所愿。写入本地磁盘或拇指驱动器,假设您有可用空间,应该没有问题。

答案 1 :(得分:3)

使用File.readlines获取输入文件中的行数组。

input_lines = File.readlines('input.txt')

然后仅选择具有偶数索引的那些。

output_lines = input_lines.select.with_index { |_, i| i.even? }

最后,在输出文件中写下这些。

File.open('output.txt', 'w') do |f|
  output_lines.each do |line|
    f.write line
  end
end