从文本文件中替换一行

时间:2014-05-11 04:58:33

标签: ruby file-io gsub

假设我有一个file.txt,其中包含Value=50行。我不确定该行的编号,因为该文件的内容可能会有所不同。在我的代码的某个时刻,我想更改此行,将其替换为Value=30。我已经有了这个代码,但我无法弄清楚如何替换而不是添加另一行。

我目前的代码:

f = File.open('file.txt', 'r+')
f.any? do |line|
  if line.include?("Value")
    num = line.split('=').last
    newNum = 30
    line = line.gsub(/#{vol}/, newNum.to_s)
    f.write(line) 
  end
end
f.close

file.txt就像是

foo
fooooo
Value=50
foo

效果很好,但它不是替换旧的Value=行,而是添加一个新行,有时在前面,有时在它下面。我已经尝试离开line.gsub()部分,但它没有对文件进行任何更改。我也试过了f.puts(line),但如果我没记错的话,只会添加一个新行。

我在RPG Maker中使用此代码,所以我想在没有像Fileutils这样的库的情况下解决这个问题,除非它们非常必要。

3 个答案:

答案 0 :(得分:3)

让我们分析一下这里出了什么问题。 File#any?返回true或false,因为它的块对于传递的至少一个块参数返回true。您没有从块中返回true或false,并且您对File#any?的结果是真还是假的问题不感兴趣。所以这显然是错误的方法。

此外,正如你正确地说,你正在编写一个新的(添加的)行,而不是以任何方式替换现有的行。

您要做的是逐行循环浏览文件,读取每一行,然后:

  • 如果该行不包含目标字符串,则写入同一行

  • 如果该行确实包含目标字符串,编写替换行

因此,您将读取整个文件并将整个文件(带或不带替换)写入其位置。这种方法实际上涉及两个文件,因为在编写它之前你已经读过这行了。

或者,您可以立即读取整个文件,将其拆分为行,查找目标并执行替换,将其连接回单个字符串,然后编写它。如果文件很小(这样字符串很小),这是最简单的方法。

有关正确的模式,请参阅https://stackoverflow.com/a/4399299/341994

答案 1 :(得分:2)

因为您正在使用r +模式打开文件,所以您实际上是打开它以进行追加。 我建议你打开一个新文件输出。 因为您不打印现有的行,所以无法存在。 您只能在找到要更改的行后添加正确的行。

答案 2 :(得分:0)

您可以使用gsub替换该值:

text = File.read(file_name)
replace = text.gsub(/Value\=\d+/, "Value=#{newNum}")
File.open(filepath, "w") {|file| file.puts replace}