【问题标题】:Deleting a specific line in a text file?删除文本文件中的特定行?
【发布时间】:2013-07-14 10:37:38
【问题描述】:

如何从文本文件中删除单个特定行?例如第三行或任何其他行。我试过这个:

line = 2
file = File.open(filename, 'r+')
file.each { last_line = file.pos unless file.eof? }
file.seek(last_line, IO::SEEK_SET)
file.close

不幸的是,它什么也没做。我尝试了很多其他解决方案,但没有任何效果。

【问题讨论】:

  • 您所说的“就地”是什么意思?
  • 您可以修改现有文件(即就地更新)或创建一个新文件。最后一种方法通常是首选,因为它是非破坏性的。检查例如 sed 有或没有选项 -i
  • 感谢您的解释。我想了解如何进行就地更新。那太棒了。
  • 你能给我一个就地更新的例子吗?我搜索了 sed 但我什么也没找到。

标签: ruby file line


【解决方案1】:

我认为由于文件系统限制,您无法安全地执行此操作。

如果您真的想进行就地编辑,您可以尝试将其写入内存,进行编辑,然后替换旧文件。但请注意,这种方法至少存在两个问题。首先,如果您的程序在重写过程中停止,您将得到一个不完整的文件。其次,如果你的文件太大,它会吃掉你的内存。

file_lines = ''

IO.readlines(your_file).each do |line|
  file_lines += line unless <put here your condition for removing the line>
end

<extra string manipulation to file_lines if you wanted>

File.open(your_file, 'w') do |file|
  file.puts file_lines
end

类似的方法应该可行,但使用临时文件更安全且是标准方法

require 'fileutils'

File.open(output_file, "w") do |out_file|
  File.foreach(input_file) do |line|
    out_file.puts line unless <put here your condition for removing the line>
  end
end

FileUtils.mv(output_file, input_file)

您的条件可以是任何表明它是不需要的行的情况,例如,file_lines += line unless line.chomp == "aaab" 会删除行“aaab”。

【讨论】:

  • 感谢您为 Doodad 工作,但您的解决方案均无效。它给了我一个错误“......未定义的方法'line_to_remove?'对于 main:Object ...”,因为“?”。你能告诉我为什么吗?
  • 对不起,line_to_remove?应该是搬迁的条件,我会相应地更新答案
  • 非常感谢!您的解决方案真的帮助了我!再次感谢!
  • 没问题,伙计。我很高兴能帮上忙!
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 2011-06-11
  • 2011-08-13
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多