中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教搜索提取特定位置的字符难题
« [1] [2] »
作者:
标题: 请教搜索提取特定位置的字符难题 上一主题 | 下一主题
cain
中级用户





积分 201
发帖 72
注册 2005-11-20
状态 离线
『楼 主』:  请教搜索提取特定位置的字符难题

在NT CMD下,要提取一TXT文件中第N行(如第5行)中的从40列开始的6个字符并使之成为一变量。要求不要用第三方软件,请达者告知。

2006-8-27 15:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 2 楼』:  



  Quote:
从40列开始

As far as I know, try this command:
more +40 C:\somefile.txt
This can print the 40th line to screen, and use Cmd variables to cut string from the the 6th, use 'for' to set the string as a final variable.




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-8-27 16:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cain
中级用户





积分 201
发帖 72
注册 2005-11-20
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by electronixtar at 2006-8-27 16:06:


As far as I know, try this command:
more +40 C:\somefile.txt
This can print the 40th line to screen, and use Cmd variables to cut string from the the 6th, use 'for' to se ...

谢谢你。不过你这个不对的,据more /?了解,“+n      从第 n 行开始显示第一个文件”

2006-8-27 16:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 4 楼』:  

for 有个 skip 参数,可以试下。

2006-8-27 17:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 5 楼』:  

于获得文件指定行的内容,个人认为最简单莫过于使用findstr了:
:dosomething
setlocal ENABLEDELAYEDEXPANSION
    for /f "delims=: tokens=1,2" %%i in ('findstr /n . %1 ^| findstr "^%2" ') do set "str=%%j"
    if "!str:~%3,1!" == "" (echo 该行没有第%3个字符... && goto :eof)
    echo !str:~%3,1!
endlocal
goto :eof
拷贝上面的代码,粘贴到你的脚本末尾,如果标号dosomething前面非空白最后一行内容不是goto :eof则自行加上。
可以在你的批处理中使用 call :dosomething 参数1 参数2 参数3来调用。
注:
参数1:要查看的文件完整路径以及文件名
参数2:行号
参数3:字符的位置

2006-8-27 19:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 6 楼』:  

楼上的有点错误:
设%3=10,“echo !str:~10,1!”显示的字符不是第“10”个字符,而是“10+1”个字符,因为第一位字符是“echo !str:~0,1!”,所以要把“%3”转换一下:“%3-1”

用“findstr /n . %1 ^| findstr "^%2"”方式要先给所有行加上行号再搜索设定的行数

改写了一个:

  Quote:
:dosomething
set/a X=%3-1
set N=0
setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%i in (%1) do (set/a N=!N!+1
    if "!N!"=="%2" set "str=%%i"&goto str)
:str
    if "!str:~%X%,1!"=="" echo 该行没有第%3个字符&goto :eof
    if "!str:~%X%,1!"==" " echo 该行第%3个字符是空格&goto :eof
echo !str:~%X%,1!
endlocal
goto :eof

(显示空格一行可以不要)

用“set/a N=!N!+1”计数,当达到“if "!N!"=="%2"”时“set "str=%%i"&goto str”
这样不用搜索全部的行

2006-8-28 03:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cain
中级用户





积分 201
发帖 72
注册 2005-11-20
状态 离线
『第 7 楼』:  

经测试,5楼版主的代码不能正确获取;6楼代码同样出错,代码中没有使用到findstr。

2006-8-28 08:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 8 楼』:  

for /f "skip=4 tokens=*" %%i in (file.txt) do (
set str=%%i
goto OUTFOR)
:OUTFOR
set str=%str:~39,6%

[ Last edited by NaturalJ0 on 2006-8-28 at 09:54 ]

2006-8-28 09:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cain
中级用户





积分 201
发帖 72
注册 2005-11-20
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by NaturalJ0 at 2006-8-28 09:44:
for /f "skip=4 tokens=*" %%i in (file.txt) do (
set str=%%i
goto OUTFOR)
:OUTFOR
set str=%str[/c ...

强!测试通过!太感谢了!再请问一下高手:如果要查找该文本文件中所有行的第40列开始的6个字符,有没有简化的方法?

2006-8-28 11:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 10 楼』:  

setlocal EnableDelayedExpansion
for /f "tokens=*" %%i in (file.txt) do (
set str=%%i
set str=!str:~39,6!
>>newfile.txt echo !str!)
endlocal

newfile.txt 中是你要的内容,每行对应原来每行中第40列起的6个字符。

[ Last edited by NaturalJ0 on 2006-8-28 at 13:14 ]

2006-8-28 13:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cain
中级用户





积分 201
发帖 72
注册 2005-11-20
状态 离线
『第 11 楼』:  

NaturalJ0实在高。现仍有二个问题:
一是在8楼代码中,我想同时实现查找第30列开始的3个字符,改成如下,但不成功:
for /f "skip=4 tokens=*" %%i in (file.txt) do (
set str=%%i
goto OUTFOR)
:OUTFOR
set str=%str:~39,6%
set str2=%str:~29,3%

二是在10代码中,我想实现的是查找该文本文件中所有行的第40列开始的6个字符并把每行中的结果独立成一个变量,不知能否?

2006-8-28 15:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 12 楼』:  

高什么高,偶也才来这里混了几天,大多是现学现用。上面几行代码还是前几天跟别人学的呢。

for /f "skip=4 tokens=*" %%i in (file.txt) do (
set str=%%i
goto OUTFOR)
:OUTFOR
set str1=%str:~39,6%
set str2=%str:~29,3%


如果全要设成变量这样试试看


setlocal EnableDelayedExpansion
set/a num=0
for /f "tokens=*" %%i in (file.txt) do (
set str=%%i
set str=!str:~39,6!
set/a num=!num!+1
set str!num!=!str!)
set str     //这条语句是为了显示下运行结果,看看变量是否符合要求
endlocal   //这些变量是临时的,只能在 endlocal 前使用,endlocal 语句执行后就自动消亡了。

[ Last edited by NaturalJ0 on 2006-8-28 at 15:45 ]

2006-8-28 15:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cain
中级用户





积分 201
发帖 72
注册 2005-11-20
状态 离线
『第 13 楼』:  

for /f "skip=4 tokens=*" %%i in (file.txt) do (
set str=%%i
goto OUTFOR)
:OUTFOR
set str1=%str:~39,6%
set str2=%str:~29,3%

这样还是不行的,我也觉得奇怪,str2就是没有任何内容。

2006-8-28 16:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 14 楼』:  

我试有内容啊

2006-8-28 17:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cain
中级用户





积分 201
发帖 72
注册 2005-11-20
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by NaturalJ0 at 2006-8-28 17:32:
我试有内容啊

不好意思,是我搞错了。不过下面这个的确通不过:
setlocal EnableDelayedExpansion
set/a num=0
for /f "tokens=*" %%i in (file.txt) do (
set str=%%i
set str=!str:~39,6!
set/a num=!num!+1
set str!num!=!str!)
set str     //这条语句是为了显示下运行结果,看看变量是否符合要求
endlocal   //这些变量是临时的,只能在 endlocal 前使用,endlocal 语句执行后就自动消亡了。

2006-8-28 17:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: