中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-26 00:34
47,812 主题排行 / 349,910 发帖 / 今日 0 篇 / 48,264 会员排行
DOS批处理 & 脚本技术(批处理室) » [求助] 如何取得一个文件的指定行数的指定位置内容
可打印版本  4,422 / 20
第1楼 krell 发表于 2006-10-03 13:58
初级用户 发帖 6 积分 116
[求助] 如何取得一个文件的指定行数的指定位置内容
批处理如何取得一个文件的指定行数的指定位置内容,并写到另一个文件中。

比如一个文件的第5排的倒数12位字符,和第6排的倒数1-3位字符(该行内容中有一个=符号后可能是1-3位字符)。

得到这两个数值后,写入到另一个文件的指定行数中。(简单点输出到文件也可以,行数不多)

实在是不会任何编程,想想批处理应该最简单吧。可是,看了不少教程,没发现讲解如何得到一个文件中的指定内容的实现方法,请各位大大指点一下,谢谢!
第2楼 namejm 发表于 2006-10-03 21:24
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  初步写出了如下代码,楼主试一下看是否可行。另外,如果能把文件的内容贴一部分出来的话,就更好找一下规律,因为我不知道你所说的 “和第6排的倒数1-3位字符(该行内容中有一个=符号后可能是1-3位字符)。” ,要提取的内容究竟是倒数1~3的字符,还是倒数的1或2或3。


[ Last edited by namejm on 2006-10-3 at 21:51 ]
第3楼 pengfei 发表于 2006-10-03 21:28
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
namejm兄的代码简洁, 如果把文本行中存在空格就无法整行提取的情况考虑进去就更好了.
第4楼 namejm 发表于 2006-10-03 21:33
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Originally posted by pengfei at 2006-10-3 21:28:
namejm兄的代码简洁, 如果把文本行中存在空格就无法整行提取的情况考虑进去就更好了.

  呵呵,其实已经能够提取行中可能存在的空格的。

  for语句中,提取存在空格的行,除了用 "tokens=*" 之外,"delims=" 也是一个不错的选择,头两天在群里讨论过的,pengfei 可能没注意到。
第5楼 pengfei 发表于 2006-10-03 21:42
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
呵呵~ 的确如此, 看来整行提取有三种方法了:

tokens=* delims=* delims=

不过我还是发现兄弟的代码for中少了一个/F参数. ^_^
第6楼 namejm 发表于 2006-10-03 21:50
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  谢谢你的提醒,确实是少了一个 /F 参数,以前写代码的时候都测试过了才发出来的,这次这个因为觉得简单就没测试了,想不到竟然出现了这个低级错误,已经改正^_^

  到目前为止,提取整行的方法我只发现了两种,而你所说的 delims=* 是难以提取的,因为它的含义只是提取以 * 分隔的内容而已。当内容中不含 * 的时候,它也会提取含有空格的行,但是,如果内容中有 * 的时候,情况就大不一样了,你测试一下就可以发现了。
第7楼 pengfei 发表于 2006-10-04 05:06
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
Originally posted by namejm at 2006-10-3 21:50:
  到目前为止,提取整行的方法我只发现了两种,而你所说的 delims=* 是难以提取的,因为它的含义只是提取以 * 分隔的内容而已。当内容中不含 * 的时候,它也会提取含有空格的行,但是,如果内容中有 * 的时候,情况就大不一样了,你测试一下就可以发现了。


看来这是我的一个习惯性错误了.

"tokens=*" 将文本行内容都赋给第一个可替换变量

"delims=" 不使用任何分隔符, 作用是取消了默认空格作为分隔符. 使文本行中的内容都赋给一个可替换变量.

"delims=*" 而这个是使用特殊分隔符, 来替代空格. 显然不行的, 像兄说的这样, 呵呵~ 一旦出现该字符将不能正常提取.
第8楼 krell 发表于 2006-10-04 12:59
初级用户 发帖 6 积分 116
谢谢两位热心的大侠。不过试了一下,好像不行。

需要得到数值的文件内容如下:
[Program ]
Name = NEW ERY
Source=FAC
[FAC]
ImageFileName=90B5A901.ACR
ImageFileNumber=34
[Burn]
ImageFileNumber=0
Description=
[Action]
DoRecovery=No


需要的数值是 90B5A901.ACR 和 34 (这个34有可能是1位的数据,也有可能是两位的数据,也有可能是3位的数据)。

得到这两个数据后写到一个新文件中。
Image_Name=这里写90B5A901.ACR,Image_Count=这里写34。

新文件内容如下:
[Program ]
Name = NEW ERY
Source=FD_INFO
[FD_INFO]
Image_Name=
Image_Count=
Image_Size=51200
Image_PerDisc=13
Image_Language=1033

想象中这个操作应该很简单的吧,不是想不劳而获,而是实在太菜,希望大侠再给点意见,谢谢!
第9楼 pengfei 发表于 2006-10-05 00:23
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
请楼主测试效果:

第10楼 namejm 发表于 2006-10-05 00:36
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  set /a num+=1 一句可以省略,在for中用 skip=4 直接跳过头4行的内容就可以从第五行内容开始读取了。或者用 more +4 1.ini 也可以达到同样的效果。
第11楼 pengfei 发表于 2006-10-05 01:45
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
我使用计数的方式提取数据是因为ImageFileNumber这一句出现了两次.
第12楼 krell 发表于 2006-10-05 04:12
初级用户 发帖 6 积分 116
呵呵,还是不行呀。

生成的新文件并未得到取值,还是这样的啦!大侠可以试试。
Image_Name=
Image_Count=
第13楼 pengfei 发表于 2006-10-05 05:02
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
需要得到数值的文件默认为当前目录下的1.ini
第14楼 krell 发表于 2006-10-05 05:45
初级用户 发帖 6 积分 116
就算是再菜也知道文件名和路径的。

不过,测试一下真的没有得到想要的结果。

附件当中的文件,楼上的大侠自己试一下了!

附件
1.rar (598 bytes)
第15楼 pengfei 发表于 2006-10-05 08:08
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
哈哈~ 看来又发现一个新大陆, 楼主的1.ini文件为unicode编码.

这种编码格式的文本行for是无法提取的, 我把1.ini改为ANSI码. 请测试...

附件
test.rar (546 bytes)
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023