设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 712|回复: 12
打印 上一主题 下一主题

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

[复制链接]

Lv5.捕梦者

梦石
0
星屑
37814
在线时间
5409 小时
注册时间
2006-11-10
帖子
6547
跳转到指定楼层
1
发表于 2023-7-27 10:32:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

  感觉应该有更简便更直接的方法吧?

Lv2.观梦者

梦石
0
星屑
380
在线时间
53 小时
注册时间
2023-7-16
帖子
19
2
发表于 2023-7-27 12:44:28 | 只看该作者
本帖最后由 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

点评

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

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

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

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

点评

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14048
在线时间
2070 小时
注册时间
2016-9-20
帖子
844
4
发表于 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 我很赞同

查看全部评分

内容仅供参考,
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
380
在线时间
53 小时
注册时间
2023-7-16
帖子
19
5
发表于 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
复制代码


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

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33193
在线时间
10491 小时
注册时间
2009-3-15
帖子
4756
6
发表于 2023-7-27 20:02:45 | 只看该作者
不用文本用INI文件如何?应该可以读写指定值的
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
380
在线时间
53 小时
注册时间
2023-7-16
帖子
19
7
发表于 2023-7-27 21:26:23 | 只看该作者
本帖最后由 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


这样能快一点么……
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14048
在线时间
2070 小时
注册时间
2016-9-20
帖子
844
8
发表于 2023-7-28 08:51:38 | 只看该作者
soulsaga 发表于 2023-7-27 20:02
不用文本用INI文件如何?应该可以读写指定值的

我看了別人做的遊戏里有ini用圣,好像也是跟txt一样是用readlines,
内容仅供参考,
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
380
在线时间
53 小时
注册时间
2023-7-16
帖子
19
9
发表于 2023-7-28 12:47:51 | 只看该作者
ppspssss 发表于 2023-7-28 08:51
我看了別人做的遊戏里有ini用圣,好像也是跟txt一样是用readlines,

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-29 18:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表