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

Ale*_*tko 4 ruby regex rubygems

假设,我有一个input.txt文件,其中包含以下文本:

First line
Second line
Third line
Fourth line
Run Code Online (Sandbox Code Playgroud)

我想删除,例如,第二行和第四行来得到这个:

First line
Third line
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经设法使用此代码仅删除第二行中的一行

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')
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ill 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
Run Code Online (Sandbox Code Playgroud)

更改是使用with_index方法捕获行号,由于在没有块的情况下调用时File#foreach返回的事实可以使用该方法Enumerator; 块现在适用于with_index,并获取行号作为第二个块参数.只需在比较中使用行号,即可获得指定的条件.

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


flo*_*oum 5

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

input_lines = File.readlines('input.txt')
Run Code Online (Sandbox Code Playgroud)

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

output_lines = input_lines.select.with_index { |_, i| i.even? }
Run Code Online (Sandbox Code Playgroud)

最后,将它们写入输出文件中。

File.open('output.txt', 'w') do |f|
  output_lines.each do |line|
    f.write line
  end
end
Run Code Online (Sandbox Code Playgroud)