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 编辑
new_file = File.read('1.ini').gsub(/caption=\d+/, 'caption=10086')
File.open('1.ini', 'w') { |f| f.write new_file }
new_file = File.read('1.ini').gsub(/caption=\d+/, 'caption=10086')
File.open('1.ini', 'w') { |f| f.write new_file }
大概这样?
我也不懂,不知还有没有类似这样的操作:
file = File.open('1.ini', 'r+')
file.each do |l|
file.某种替换当前行的方法('caption=10086') if l =~ /caption=\d+/
end
file.close
file = File.open('1.ini', 'r+')
file.each do |l|
file.某种替换当前行的方法('caption=10086') if l =~ /caption=\d+/
end
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楼大佬说的,保留位置然后这样:
- file = File.open('1.ini', 'r+')
- file.seek(123) # 直接在准确位置操作
- file.write '10086'
- file.close
复制代码
缺点是必须所有长度都是固定的才能这么干……
作者: soulsaga 时间: 2023-7-27 20:02
不用文本用INI文件如何?应该可以读写指定值的
作者: zlyl_wiley 时间: 2023-7-27 21:26
本帖最后由 zlyl_wiley 于 2023-7-27 21:37 编辑
File.open('address.txt', 'w'){ |f| f.write "name=阿尔西斯\nphone_number=15915915159\n"}
# values的[0]是值的起始位置,[1]是占用长度,先自己掰手指头算好
$pos = { :name => [5, 12], :number => [32, 11] }
def save_to_file(key, value)
s = value + " " * ($pos[key][1] - value.length)
File.open('address.txt', 'r+') do |file|
file.seek($pos[key][0])
file.write(s)
end
end
def load_from_file(key)
File.open('address.txt', 'r') do |file|
file.seek($pos[key][0])
return file.gets
end
end
# 字符串才strip,因为to_i已有同样效果
p $name = load_from_file(:name).strip # => "阿尔西斯"
p $number = load_from_file(:number).to_i # => 15915915159
$name = "艾里克"
$number = 10086
save_to_file(:name, $name)
save_to_file(:number, $number.to_s)
p $name2 = load_from_file(:name).strip # => "艾里克"
p $number2 = load_from_file(:number).to_i # => 10086
File.open('address.txt', 'w'){ |f| f.write "name=阿尔西斯\nphone_number=15915915159\n"}
# values的[0]是值的起始位置,[1]是占用长度,先自己掰手指头算好
$pos = { :name => [5, 12], :number => [32, 11] }
def save_to_file(key, value)
s = value + " " * ($pos[key][1] - value.length)
File.open('address.txt', 'r+') do |file|
file.seek($pos[key][0])
file.write(s)
end
end
def load_from_file(key)
File.open('address.txt', 'r') do |file|
file.seek($pos[key][0])
return file.gets
end
end
# 字符串才strip,因为to_i已有同样效果
p $name = load_from_file(:name).strip # => "阿尔西斯"
p $number = load_from_file(:number).to_i # => 15915915159
$name = "艾里克"
$number = 10086
save_to_file(:name, $name)
save_to_file(:number, $number.to_s)
p $name2 = load_from_file(:name).strip # => "艾里克"
p $number2 = load_from_file(:number).to_i # => 10086
这样能快一点么……
作者: ppspssss 时间: 2023-7-28 08:51
我看了別人做的遊戏里有ini用圣,好像也是跟txt一样是用readlines,
作者: zlyl_wiley 时间: 2023-7-28 12:47
.ini就是按特定格式写的txt,所以基本没区别的,6楼指的可能是用解析库吧,那样操作可能是方便了,但是楼主的意思是要提高执行效率,虽然不知道那些库具体是怎么实现的,但盲猜还是不可能更快的吧
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |