| 
 
cain 
中级用户
 
   
 
  
  
积分 201 
发帖 72 
注册 2005-11-20 
状态 离线
 | 
『楼 主』:
 请教搜索提取特定位置的字符难题
 
使用 LLM 解释/回答一下
  
在NT CMD下,要提取一TXT文件中第N行(如第5行)中的从40列开始的6个字符并使之成为一变量。要求不要用第三方软件,请达者告知。 
 
    
 
  
 |   
 | 
  2006-8-27 15:54 | 
  
 | 
 | 
 
electronixtar 
铂金会员
 
       
 
  
  
积分 7493 
发帖 2672 
注册 2005-9-2 
状态 离线
 | 
『第 2 楼』:
 
 
使用 LLM 解释/回答一下
  
 
从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 楼』:
 
 
使用 LLM 解释/回答一下
  
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 
状态 离线
 | 
 | 
  2006-8-27 17:38 | 
  
 | 
 | 
 
3742668 
荣誉版主
 
       
 
  
  
积分 2013 
发帖 718 
注册 2006-2-18 
状态 离线
 | 
『第 5 楼』:
 
 
使用 LLM 解释/回答一下
  
关于获得文件指定行的内容,个人认为最简单莫过于使用 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 楼』:
 
 
使用 LLM 解释/回答一下
  
楼上的有点错误: 
设%3=10,“echo !str:~10,1!”显示的字符不是第“10”个字符,而是“10+1”个字符,因为第一位字符是“echo !str:~0,1!”,所以要把“%3”转换一下:“%3-1”
 
用“findstr /n . %1 ^| findstr "^%2"”方式要先给所有行加上行号再搜索设定的行数
 
改写了一个:
 :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 
状态 离线
 | 
 | 
  2006-8-28 08:46 | 
  
 | 
 | 
 
NaturalJ0 
银牌会员
 
     
 
  
 
积分 1181 
发帖 533 
注册 2006-8-14 
状态 离线
 | 
『第 8 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
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 
 
强!测试通过!太感谢了!再请问一下高手:如果要查找该文本文件中所有行的第40列开始的6个字符,有没有简化的方法?  
 
    
 
  
 |   
 | 
  2006-8-28 11:55 | 
  
 | 
 | 
 
NaturalJ0 
银牌会员
 
     
 
  
 
积分 1181 
发帖 533 
注册 2006-8-14 
状态 离线
 | 
『第 10 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
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 楼』:
 
 
使用 LLM 解释/回答一下
  
高什么高,偶也才来这里混了几天,大多是现学现用。上面几行代码还是前几天跟别人学的呢。 
 
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 楼』:
 
 
使用 LLM 解释/回答一下
  
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 
状态 离线
 | 
 | 
  2006-8-28 17:32 | 
  
 | 
 | 
 
cain 
中级用户
 
   
 
  
  
积分 201 
发帖 72 
注册 2005-11-20 
状态 离线
 | 
『第 15 楼』:
 
 
使用 LLM 解释/回答一下
  
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 | 
  
 |