Board logo

标题: [文本处理] 显示文本中指定行的内容 [打印本页]

作者: 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

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. :ip
  4. set /p ip=input:&cls
  5. echo !ip!|findstr "^[0-9]*$">nul||goto ip
  6. set /a ip-=1&if not !ip!==0 set "sk=skip=!ip! "
  7. for /f "!sk!delims=" %%i in (aa.txt) do if "!tp!"=="" echo %%i>bb.txt&set tp=Y
  8. pause>nul
复制代码

[ 本帖最后由 yslyxqysl 于 2009-1-17 17:59 编辑 ]
作者: aabb    时间: 2009-1-11 17:17

  1. @echo off
  2. set /p w=请输入要选择的行数:
  3. set /a w=%w%-1
  4. for /f "skip=%w%" %%b in (aa.txt) do (
  5. setlocal enabledelayedexpansion
  6. set /a q=!q!+1
  7. if !q! gtr 1 goto b
  8. echo %%b>f.txt
  9. )
  10. :b
  11. 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

  1. @if not defined debug @echo off
  2. :loop
  3. set /p "input=要输入的行数:"
  4. echo %input%|findstr -RC:"^[0-9]*$" >nul 2>&1 || echo.输入行号错误请重新输入 && goto loop
  5. for /f "tokens=2* delims=:" %%a in (
  6. '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分段读取,到指定行就显示出来

  1. @echo off
  2. for /f "tokens=1,2* delims=:" %%a in ('findstr /n . a.txt') do if %%a==3 echo %%b
  3. pause
复制代码


缺陷:空行的话findstr是不显示的,反正是空行,显示了别人也不知道

思路二:用变量储存行数

利用变量,每处理一行就增加1,到行数就显示

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (a.txt) do (
  4. set /a line+=1
  5. if !line!==3 echo %%a
  6. )
  7. pause
复制代码


缺点:用了变量延迟,不过也可以随时关闭掉

思路三:用more或for跳过行数

利用more的跳过行数来跳过前两行,然后显示完第三行就跳出for

  1. @echo off
  2. for /f "delims=" %%a in ('more a.txt +2') do echo %%a&goto end
  3. :end
  4. pause
复制代码


类同,用for的skip功能跳过前两行,然后显示完第三行就跳出for

  1. @echo off
  2. for /f "skip=2 delims=" %%a in (a.txt) do echo %%a&goto end
  3. :end
  4. pause
复制代码


缺点:多用了一个标签,不过不伤大雅

思路四:利用set /p配合more

先利用more把前两行过滤掉保存到tmp.txt,然后再用set /p保存到变量内容中,最后删除临时文件tmp.txt

  1. @echo off
  2. more a.txt +2>tmp.txt
  3. set /p a=<tmp.txt
  4. echo %a%
  5. del /q tmp.txt
  6. pause
复制代码


缺点:临时文件,给人厌恶感



这么多种方法中,方法一和方法二是最普通的,而且扩展一下,可以把每一行的内容都保存到变量中,要用的时候就可以直接用变量,省去了读取的时间

方法三可拓展性极低,只能单纯的解决问题,多次读取要浪费时间。不过方法三的第二种(用for的skip跳行数)读取几乎不需要时间,因此每次读取也不感觉停顿

方法四纯粹无理取闹,没有特殊情况用前三种就可以了
作者: Batcher    时间: 2009-1-17 19:46     标题: 回复 11楼 的帖子

关于$的意思,可以到教学区看看findstr正则表达式的讲解。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2