查看: 2170|回复: 12

[有事请教] 如何改写文档文件里特定的一行文本?

[复制链接]
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2023-7-27 10:32:43 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 灯笼菜刀王 于 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")}}

  感觉应该有更简便更直接的方法吧?
梦石
0
星屑
410
在线时间
60 小时
注册时间
2023-7-16
回帖
17
发表于 2023-7-27 12:44:28 | 显示全部楼层
本帖最后由 zlyl_wiley 于 2023-7-27 13:07 编辑

[pre lang="ruby"]
new_file = File.read('1.ini').gsub(/caption=\d+/, 'caption=10086')
File.open('1.ini', 'w') { |f| f.write new_file }
[/pre]

大概这样?

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

[pre lang="ruby"]
file = File.open('1.ini', 'r+')
file.each do |l|
  file.某种替换当前行的方法('caption=10086') if l =~ /caption=\d+/
end
file.close
[/pre]

点评

直接gsub是个好主意, 可以精简结构。不过这样还是清空后重写嘛, 我是想增加点写入效率,毕竟我之后要频繁的"改写变量值", 笑  发表于 2023-7-27 15:10

评分

参与人数 1赞 +1 收起 理由
灯笼菜刀王 + 1 精品文章

查看全部评分

回复

使用道具 举报

梦石
0
星屑
8003
在线时间
1184 小时
注册时间
2007-7-29
回帖
2014
发表于 2023-7-27 13:30:58 | 显示全部楼层
如果是想缩减运算成本应该不行,毕竟文件写入本来就是根据格式,想要快速针对某个区域读写必须有位置保留等才能做到,那就是数据库了。

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

我也坐等卡位看看有没有神人给出解决方案。

点评

不行的话我就只好换全局变量保存咯, 摊手  发表于 2023-7-27 15:18
如果分割多个文本的话速度可能可以速度快点  发表于 2023-7-27 14:58

评分

参与人数 1赞 +1 收起 理由
灯笼菜刀王 + 1 我很赞同

查看全部评分

回复

使用道具 举报

梦石
0
星屑
14720
在线时间
2175 小时
注册时间
2016-9-20
回帖
777
发表于 2023-7-27 14:42:55 | 显示全部楼层
$subject=[$subject = File.readlines("网页源代码.txt")#$subject等于行里所有行数
#p $subject.size
  for i in 0...$subject.size  #遍历所有行数
$subject[i].chomp! #!發生變化并返回 #刪換行符

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

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

点评

主要是每改动一个"变量" 就要重写一次, 感觉很没效率, 摊手  发表于 2023-7-27 15:17

评分

参与人数 1赞 +1 收起 理由
灯笼菜刀王 + 1 我很赞同

查看全部评分

贴子只供参考我贴子内容有很多只是我自己标识的内容代指不是原来意思,偏向发贴当时的想法(后来回看贴发现有很多错误,会造成误导 ),如果想靠谱点应 找相关正确的文章   -- 2025/4/19
回复

使用道具 举报

梦石
0
星屑
410
在线时间
60 小时
注册时间
2023-7-16
回帖
17
发表于 2023-7-27 15:45:41 | 显示全部楼层
本帖最后由 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
复制代码


缺点是必须所有长度都是固定的才能这么干……
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2023-7-27 20:02:45 | 显示全部楼层
不用文本用INI文件如何?应该可以读写指定值的
回复

使用道具 举报

梦石
0
星屑
410
在线时间
60 小时
注册时间
2023-7-16
回帖
17
发表于 2023-7-27 21:26:23 | 显示全部楼层
本帖最后由 zlyl_wiley 于 2023-7-27 21:37 编辑

[pre lang="ruby"]
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
[/pre]

这样能快一点么……
回复

使用道具 举报

梦石
0
星屑
14720
在线时间
2175 小时
注册时间
2016-9-20
回帖
777
发表于 2023-7-28 08:51:38 | 显示全部楼层
soulsaga 发表于 2023-7-27 20:02
不用文本用INI文件如何?应该可以读写指定值的

我看了別人做的遊戏里有ini用圣,好像也是跟txt一样是用readlines, NX})PAAKB_3}2OS[%B]9@K9.png
贴子只供参考我贴子内容有很多只是我自己标识的内容代指不是原来意思,偏向发贴当时的想法(后来回看贴发现有很多错误,会造成误导 ),如果想靠谱点应 找相关正确的文章   -- 2025/4/19
回复

使用道具 举报

梦石
0
星屑
410
在线时间
60 小时
注册时间
2023-7-16
回帖
17
发表于 2023-7-28 12:47:51 | 显示全部楼层
ppspssss 发表于 2023-7-28 08:51
我看了別人做的遊戏里有ini用圣,好像也是跟txt一样是用readlines,

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部