假设我有一个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这样的库的情况下解决这个问题,除非它们非常必要。
答案 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}