标题: [文本处理] 显示文本中指定行的内容 [打印本页]
作者: wyl1986 时间: 2009-1-11 17:00 标题: 显示文本中指定行的内容
文档aa.txt中内容为:
qwe
ewq
asd
dsa
zxc
cxz
理想结果:
输入3则取第3行内容:“asd”
并写入文本bb.txt
作者: yslyxqysl 时间: 2009-1-11 17:16
- @echo off
- setlocal ENABLEDELAYEDEXPANSION
- :ip
- set /p ip=input:&cls
- echo !ip!|findstr "^[0-9]*$">nul||goto ip
- set /a ip-=1&if not !ip!==0 set "sk=skip=!ip! "
- for /f "!sk!delims=" %%i in (aa.txt) do if "!tp!"=="" echo %%i>bb.txt&set tp=Y
- pause>nul
复制代码
[ 本帖最后由 yslyxqysl 于 2009-1-17 17:59 编辑 ]
作者: aabb 时间: 2009-1-11 17:17
- @echo off
- set /p w=请输入要选择的行数:
- set /a w=%w%-1
- for /f "skip=%w%" %%b in (aa.txt) do (
- setlocal enabledelayedexpansion
- set /a q=!q!+1
- if !q! gtr 1 goto b
- echo %%b>f.txt
- )
- :b
- pause>nul
复制代码
楼主试试这个代码!!!
作者: yslyxqysl 时间: 2009-1-11 17:20 标题: 回复 3楼 的帖子
万一要取"I can do it."呢?
作者: aabb 时间: 2009-1-11 17:22
你的意思就是说包含空格??
我只是按楼主的意思写了,也没考虑那么多,,但是我想只要加以修改还是可以实现的
\没考虑那么多,不好意思!!!!!
作者: batman 时间: 2009-1-11 23:42
原帖由 yslyxqysl 于 2009-1-11 17:20 发表
万一要取"I can do it."呢?
在for /f " "中加个delims=
作者: hidden 时间: 2009-1-12 09:10
我调试了一下2楼的好像没有达到其效果啊
作者: Batcher 时间: 2009-1-12 09:15 标题: 回复 7楼 的帖子
请列出自己的测试用例、测试结果。
仅凭一句“好像没有达到其效果”,没人能帮得了你。
作者: hidden 时间: 2009-1-12 09:19
文档aa.txt中内容为:
qwe
ewq
asd
dsa
zxc
cxz
就是这个例子呀,可是当输入行数后,并没有生成指定的文件
作者: sylovanas 时间: 2009-1-12 09:43
- @if not defined debug @echo off
-
- :loop
- set /p "input=要输入的行数:"
- echo %input%|findstr -RC:"^[0-9]*$" >nul 2>&1 || echo.输入行号错误请重新输入 && goto loop
- for /f "tokens=2* delims=:" %%a in (
- 'findstr -N "." aa.txt ^| findstr -RC:"^%input%:"') do echo %%a>>bb.txt )
复制代码
[ 本帖最后由 sylovanas 于 2009-1-12 10:00 编辑 ]
作者: moshou 时间: 2009-1-17 17:54 标题: 回复 2楼 的帖子
代码中那个$是什么意思,原来没有见过
另外,当我输入1的时候,就无法达到目的,提示此时不应有delims="
作者: defanive 时间: 2009-1-17 18:37 标题: 思路&代码
这个是以前就遇到过的问题,其实方法是有很多种的
思路一:用findstr
利用findstr的/n功能,让每行前都显示个行号,然后用for分段读取,到指定行就显示出来
- @echo off
- for /f "tokens=1,2* delims=:" %%a in ('findstr /n . a.txt') do if %%a==3 echo %%b
- pause
复制代码
缺陷:空行的话findstr是不显示的,反正是空行,显示了别人也不知道
思路二:用变量储存行数
利用变量,每处理一行就增加1,到行数就显示
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set /a line+=1
- if !line!==3 echo %%a
- )
- pause
复制代码
缺点:用了变量延迟,不过也可以随时关闭掉
思路三:用more或for跳过行数
利用more的跳过行数来跳过前两行,然后显示完第三行就跳出for
- @echo off
- for /f "delims=" %%a in ('more a.txt +2') do echo %%a&goto end
- :end
- pause
复制代码
类同,用for的skip功能跳过前两行,然后显示完第三行就跳出for
- @echo off
- for /f "skip=2 delims=" %%a in (a.txt) do echo %%a&goto end
- :end
- pause
复制代码
缺点:多用了一个标签,不过不伤大雅
思路四:利用set /p配合more
先利用more把前两行过滤掉保存到tmp.txt,然后再用set /p保存到变量内容中,最后删除临时文件tmp.txt
- @echo off
- more a.txt +2>tmp.txt
- set /p a=<tmp.txt
- echo %a%
- del /q tmp.txt
- pause
复制代码
缺点:临时文件,给人厌恶感
这么多种方法中,方法一和方法二是最普通的,而且扩展一下,可以把每一行的内容都保存到变量中,要用的时候就可以直接用变量,省去了读取的时间
方法三可拓展性极低,只能单纯的解决问题,多次读取要浪费时间。不过方法三的第二种(用for的skip跳行数)读取几乎不需要时间,因此每次读取也不感觉停顿
方法四纯粹无理取闹,没有特殊情况用前三种就可以了
作者: Batcher 时间: 2009-1-17 19:46 标题: 回复 11楼 的帖子
关于$的意思,可以到教学区看看findstr正则表达式的讲解。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |