Project1

标题: 如何改写文档文件里特定的一行文本? [打印本页]

作者: 灯笼菜刀王    时间: 2023-7-27 10:32
标题: 如何改写文档文件里特定的一行文本?
本帖最后由 灯笼菜刀王 于 2023-7-27 10:33 编辑

open("1.ini","w")  会把文件内容全清空, 但我只想覆写其中一个值或者说一行, 请问有没有啥简便的方法?

我能想到的方法是:

re = /caption=/
lines = File.readlines('1.ini')
a = lines.index(lines.find { |i| re =~ i } )
lines[a] = 'caption=10086'
open("1.ini","w")
lines.each{|i|  File.open("1.ini","a"){|io| io.write(i + "\n")}}

  感觉应该有更简便更直接的方法吧?
作者: zlyl_wiley    时间: 2023-7-27 12:44
本帖最后由 zlyl_wiley 于 2023-7-27 13:07 编辑

RUBY 代码复制
  1. new_file = File.read('1.ini').gsub(/caption=\d+/, 'caption=10086')
  2. File.open('1.ini', 'w') { |f| f.write new_file }


大概这样?

我也不懂,不知还有没有类似这样的操作:

RUBY 代码复制
  1. file = File.open('1.ini', 'r+')
  2. file.each do |l|
  3.   file.某种替换当前行的方法('caption=10086') if l =~ /caption=\d+/
  4. end
  5. file.close

作者: enghao_lim    时间: 2023-7-27 13:30
如果是想缩减运算成本应该不行,毕竟文件写入本来就是根据格式,想要快速针对某个区域读写必须有位置保留等才能做到,那就是数据库了。

如果只是精简代码,这个应该就不需要吧……

我也坐等卡位看看有没有神人给出解决方案。
作者: ppspssss    时间: 2023-7-27 14:42
$subject=[$subject = File.readlines("网页源代码.txt")#$subject等于行里所有行数
#p $subject.size
  for i in 0...$subject.size  #遍历所有行数
$subject[i].chomp! #!發生變化并返回 #刪換行符

最后把$subject數組寫回去文件

我也是用这方法, 逐行掃描也挺方便,


作者: zlyl_wiley    时间: 2023-7-27 15:45
本帖最后由 zlyl_wiley 于 2023-7-27 16:24 编辑

刚刚不对,编辑掉……
我大概知道了,像3楼大佬说的,保留位置然后这样:

  1. file = File.open('1.ini', 'r+')
  2. file.seek(123) # 直接在准确位置操作
  3. file.write '10086'
  4. file.close
复制代码


缺点是必须所有长度都是固定的才能这么干……
作者: soulsaga    时间: 2023-7-27 20:02
不用文本用INI文件如何?应该可以读写指定值的
作者: zlyl_wiley    时间: 2023-7-27 21:26
本帖最后由 zlyl_wiley 于 2023-7-27 21:37 编辑

RUBY 代码复制
  1. File.open('address.txt', 'w'){ |f| f.write "name=阿尔西斯\nphone_number=15915915159\n"}
  2.  
  3. # values的[0]是值的起始位置,[1]是占用长度,先自己掰手指头算好
  4. $pos = { :name => [5, 12], :number => [32, 11] }
  5.  
  6. def save_to_file(key, value)
  7.   s = value + " " * ($pos[key][1] - value.length)
  8.   File.open('address.txt', 'r+') do |file|
  9.     file.seek($pos[key][0])
  10.     file.write(s)
  11.   end
  12. end
  13.  
  14. def load_from_file(key)
  15.   File.open('address.txt', 'r') do |file|
  16.     file.seek($pos[key][0])
  17.     return file.gets
  18.   end
  19. end
  20.  
  21. # 字符串才strip,因为to_i已有同样效果
  22. p $name = load_from_file(:name).strip # => "阿尔西斯"
  23. p $number = load_from_file(:number).to_i # => 15915915159
  24.  
  25. $name = "艾里克"
  26. $number = 10086
  27.  
  28. save_to_file(:name, $name)
  29. save_to_file(:number, $number.to_s)
  30.  
  31. p $name2 = load_from_file(:name).strip # => "艾里克"
  32. p $number2 = load_from_file(:number).to_i # => 10086


这样能快一点么……
作者: ppspssss    时间: 2023-7-28 08:51
soulsaga 发表于 2023-7-27 20:02
不用文本用INI文件如何?应该可以读写指定值的

我看了別人做的遊戏里有ini用圣,好像也是跟txt一样是用readlines,
作者: zlyl_wiley    时间: 2023-7-28 12:47
ppspssss 发表于 2023-7-28 08:51
我看了別人做的遊戏里有ini用圣,好像也是跟txt一样是用readlines,

.ini就是按特定格式写的txt,所以基本没区别的,6楼指的可能是用解析库吧,那样操作可能是方便了,但是楼主的意思是要提高执行效率,虽然不知道那些库具体是怎么实现的,但盲猜还是不可能更快的吧




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1