Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 替换文本文件中的一行_Ruby_File Io_Gsub - Fatal编程技术网

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