假设我有一个带有以下文字的 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中删除文本文件中多行的正确方法是什么?
答案 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