Ruby 替换文本文件中的一行
假设我有一个Ruby 替换文本文件中的一行,ruby,file-io,gsub,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 = 3
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这样的库的情况下解决这个问题,除非它们是非常必要的 您可以使用
gsub
替换该值:
text = File.read(file_name)
replace = text.gsub(/Value\=\d+/, "Value=#{newNum}")
File.open(filepath, "w") {|file| file.puts replace}
您可以使用
gsub
替换该值:
text = File.read(file_name)
replace = text.gsub(/Value\=\d+/, "Value=#{newNum}")
File.open(filepath, "w") {|file| file.puts replace}
让我们分析一下这里出了什么问题
File#any?
根据其块对至少一个传递的块参数返回true,返回true或false。您没有从块返回true或false,您对File#any?
的结果是true还是false不感兴趣。所以这显然是错误的方法
此外,正如你正确地说的,你正在写一个新的(添加的)行,而不是以任何方式取代现有的行
您要做的是逐行循环浏览文件,读取每一行,然后:
- 如果该行不包含目标字符串,请编写完全相同的行
- 如果该行确实包含目标字符串,则写入替换行
有关正确的模式,请参见让我们分析这里的错误
File#any?
根据其块对至少一个传递的块参数返回true,返回true或false。您没有从块返回true或false,您对File#any?
的结果是true还是false不感兴趣。所以这显然是错误的方法
此外,正如你正确地说的,你正在写一个新的(添加的)行,而不是以任何方式取代现有的行
您要做的是逐行循环浏览文件,读取每一行,然后:
- 如果该行不包含目标字符串,请编写完全相同的行
- 如果该行确实包含目标字符串,则写入替换行
有关正确的模式,请参见,因为您使用r+模式打开文件,实际上就是为了追加而打开文件。 我建议您打开一个新文件进行输出。 因为您没有打印现有行,所以它们不可能不在那里。
只有在找到要更改的行后,才能添加正确的行。因为您使用r+模式打开文件,所以实际上是在为追加打开文件。 我建议您打开一个新文件进行输出。 因为您没有打印现有行,所以它们不可能不在那里。
只有在找到要更改的行后,才能添加正确的行。或of或of或just
File.write(filepath,replace)
。感谢您的回答!不幸的是,我需要脚本来遍历每个字符串(因为我希望它做一些其他事情)。但我相信它会帮助一些通过谷歌来到这里的人:)。不过,有一个问题,我是否需要文件。关闭
?使用读取
会导致无法扩展的解决方案。文件太大而无法放入内存将导致脚本爬网。不要那样做。请参阅了解为什么read
可能是邪恶的。或者只是File.write(filepath,replace)
。感谢您的回答!不幸的是,我需要脚本来遍历每个字符串(因为我希望它做一些其他事情)。但我相信它会帮助一些通过谷歌来到这里的人:)。不过,有一个问题,我是否需要文件。关闭
?使用读取
会导致无法扩展的解决方案。文件太大而无法放入内存将导致脚本爬网。不要那样做。看看为什么阅读是邪恶的。嘿,谢谢你的帮助。我对IO的事情还不熟悉,但你的回答帮助我更好地理解了发生的事情。我将每一行推入一个数组,然后在输出文件中打印该数组。它工作没有问题。不要一次读取所有文件,也就是“slurping”。它会导致无法扩展的解决方案,从而使程序瘫痪。有关更多信息,请参阅。嘿,谢谢你的帮助。我对IO的事情还不熟悉,但你的回答帮助我更好地理解了发生的事情。我在推每一个li