中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助] 如何取得一个文件的指定行数的指定位置内容
« [1] [2] »
作者:
标题: [求助] 如何取得一个文件的指定行数的指定位置内容 上一主题 | 下一主题
krell
初级用户




积分 116
发帖 6
注册 2005-4-1
状态 离线
『楼 主』:  [求助] 如何取得一个文件的指定行数的指定位置内容

批处理如何取得一个文件的指定行数的指定位置内容,并写到另一个文件中。

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

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

实在是不会任何编程,想想批处理应该最简单吧。可是,看了不少教程,没发现讲解如何得到一个文件中的指定内容的实现方法,请各位大大指点一下,谢谢!

2006-10-3 13:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  初步写出了如下代码,楼主试一下看是否可行。另外,如果能把文件的内容贴一部分出来的话,就更好找一下规律,因为我不知道你所说的 “和第6排的倒数1-3位字符(该行内容中有一个=符号后可能是1-3位字符)。” ,要提取的内容究竟是倒数1~3的字符,还是倒数的1或2或3。
@echo off
set num=0
setlocal enabledelayedexpansion
for /f "skip=4 delims=" %%i in (test.txt) do (
    set /a num+=1
    set var=%%i
    if !num! equ 1 echo !var:~-12,1!
    if !num! equ 2 echo !var:~-3,3! && goto end
)
:end
pause
[ Last edited by namejm on 2006-10-3 at 21:51 ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-3 21:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 3 楼』:  

namejm兄的代码简洁, 如果把文本行中存在空格就无法整行提取的情况考虑进去就更好了.

2006-10-3 21:28
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by pengfei at 2006-10-3 21:28:
namejm兄的代码简洁, 如果把文本行中存在空格就无法整行提取的情况考虑进去就更好了.

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

  for语句中,提取存在空格的行,除了用 "tokens=*" 之外,"delims=" 也是一个不错的选择,头两天在群里讨论过的,pengfei 可能没注意到。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-3 21:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 5 楼』:  

呵呵~  的确如此, 看来整行提取有三种方法了:

tokens=*   delims=*  delims=

不过我还是发现兄弟的代码for中少了一个/F参数. ^_^

2006-10-3 21:42
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 6 楼』:  

  谢谢你的提醒,确实是少了一个 /F 参数,以前写代码的时候都测试过了才发出来的,这次这个因为觉得简单就没测试了,想不到竟然出现了这个低级错误,已经改正^_^

  到目前为止,提取整行的方法我只发现了两种,而你所说的 delims=* 是难以提取的,因为它的含义只是提取以 * 分隔的内容而已。当内容中不含 * 的时候,它也会提取含有空格的行,但是,如果内容中有 * 的时候,情况就大不一样了,你测试一下就可以发现了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-3 21:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by namejm at 2006-10-3 21:50:
  到目前为止,提取整行的方法我只发现了两种,而你所说的 delims=* 是难以提取的,因为它的含义只是提取以 * 分隔的内容而已。当内容中不含 * 的时候,它也会提取含有空格的行,但是,如果内容中有 * 的时候,情况就大不一样了,你测试一下就可以发现了。

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

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

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

"delims=*" 而这个是使用特殊分隔符, 来替代空格. 显然不行的, 像兄说的这样, 呵呵~  一旦出现该字符将不能正常提取.

2006-10-4 05:06
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
krell
初级用户




积分 116
发帖 6
注册 2005-4-1
状态 离线
『第 8 楼』:  

谢谢两位热心的大侠。不过试了一下,好像不行。

需要得到数值的文件内容如下:
[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

想象中这个操作应该很简单的吧,不是想不劳而获,而是实在太菜,希望大侠再给点意见,谢谢!

2006-10-4 12:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 9 楼』:  

请楼主测试效果:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims==" %%i in (1.ini) do (
    set /a num+=1
    if !num! lss 8 (
        if /i "%%i"=="ImageFileName" set one=%%j
        if /i "%%i"=="ImageFileNumber" set two=%%j
    )
)
(
echo [Program ]
echo Name = NEW ERY
echo Source=FD_INFO
echo [FD_INFO]
echo Image_Name=%one%
echo Image_Count=%two%
echo Image_Size=51200
echo Image_PerDisc=13
echo Image_Language=1033
)>2.ini
pause


2006-10-5 00:23
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 10 楼』:  

  set /a num+=1 一句可以省略,在for中用 skip=4 直接跳过头4行的内容就可以从第五行内容开始读取了。或者用 more +4 1.ini 也可以达到同样的效果。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-5 00:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 11 楼』:  

我使用计数的方式提取数据是因为ImageFileNumber这一句出现了两次.

2006-10-5 01:45
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
krell
初级用户




积分 116
发帖 6
注册 2005-4-1
状态 离线
『第 12 楼』:  

呵呵,还是不行呀。

生成的新文件并未得到取值,还是这样的啦!大侠可以试试。
Image_Name=
Image_Count=

2006-10-5 04:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 13 楼』:  

需要得到数值的文件默认为当前目录下的1.ini

2006-10-5 05:02
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
krell
初级用户




积分 116
发帖 6
注册 2005-4-1
状态 离线
『第 14 楼』:  

就算是再菜也知道文件名和路径的。

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

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

附件 1: 1.rar (2006-10-5 05:45, 598 bytes, 下载附件所需积分 1 点 ,下载次数: 21)
2006-10-5 05:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 15 楼』:  

哈哈~ 看来又发现一个新大陆, 楼主的1.ini文件为unicode编码.

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

附件 1: test.rar (2006-10-5 08:08, 546 bytes, 下载附件所需积分 1 点 ,下载次数: 24)
2006-10-5 08:08
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: