Board logo

标题: [文本处理] [代码征集]批处理读取文件指定行 [打印本页]

作者: youxi01    时间: 2007-12-21 12:27     标题: [代码征集]批处理读取文件指定行

程序名:读取文件指定行
程序说明:能够读取文件指定行的内容,如指定4 8,则读取文件4行到8行的内容

补充说明:1、代码简洁,通用性较高;2、可以处理空行;3、最好封装成函数(封装出来的函数,请另开一帖)
作者: novaa    时间: 2007-12-21 17:31

空行怎么弄不知道,用"delims=“会忽略空行。
作者: foxJL    时间: 2007-12-21 22:49

1.不清除行号.
  1. @echo off
  2. ::code by foxjl
  3. ::没有作清除行号的处理,觉得显示行号还是有必要的.
  4. set/p file=拖入文件:
  5. set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
  6. call :start %row%
  7. :start
  8. if "%2"=="" call :start %1 %1
  9. for /l %%i in (%1,1,%2) do (findstr /n .* %file% | findstr "^%%i:")
  10. echo.完成
  11. pause>nul&exit
复制代码
2.清除行号
  1. @echo off
  2. ::code by foxjl
  3. ::这段代码是清除了行号的.
  4. set/p file=拖入文件:
  5. set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
  6. call :start %row%
  7. :start
  8. if "%2"=="" call :start %1 %1
  9. for /l %%i in (%1,1,%2) do (
  10. for /f %%j in ('findstr /n .* %file% ^| findstr "^%%i:"') do (
  11. set "var=%%j" & call set var=%%var:*:=%%
  12. call echo.%%var%%
  13. )
  14. )
  15. echo.完成
  16. pause>nul&exit
复制代码

[ 本帖最后由 foxJL 于 2007-12-23 22:04 编辑 ]
作者: novaa    时间: 2007-12-21 23:04

代码精炼啊!
呵呵
这样就不会忽略空行了。
作者: ranon    时间: 2007-12-22 09:54

bu错哈,如果不出现1:2:3:就好看了
作者: novaa    时间: 2007-12-22 12:34

原帖由 ranon 于 2007-12-22 09:54 发表
bu错哈,如果不出现1:2:3:就好看了

是故意不去掉的。如果
作者: newyj    时间: 2007-12-23 21:01

  1. @echo off
  2. set/p file=拖入文件:
  3. set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
  4. :start
  5. if "%row:~0,1%"=="" set row=%row:~1%&&goto :start
  6. for %%a in (%row%) do (set str1=%%a && set str2=%%b)
  7. if "str1" gtr "str2" (set var=%str1% && set str1=%str2% && set str2=%str1%)
  8. for /f "tokens=1* delims=:" %%i in ('fomdstr /n ".*" %~nxfile%') do (
  9.     if "%%i" geq "!str1!" if "%%i" leq "!!str2" echo %%j
  10. )
  11. pause
复制代码

借鉴一下3楼斑竹的代码 写了个 有些冗余
权当练习 还请指教

[ 本帖最后由 newyj 于 2007-12-23 21:05 编辑 ]
作者: foxJL    时间: 2007-12-23 21:21

兄弟的代码似乎没有测试过.有明显错误的地方.
作者: newyj    时间: 2007-12-23 21:27

恩 是的 还请斑竹 指教 谢谢了
作者: foxJL    时间: 2007-12-23 21:54

指教可不敢当.大家一起学习嘛.
就我明眼看到的错误说说吧:
@echo off
set/p file=拖入文件:
set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
:start
if "%row:~0,1%"=="" set row=%row:~1%&&goto :start
for %%a in (%row%) do (set str1=%%a && set str2=%%b)
if "str1" gtr "str2" (set var=%str1% && set str1=%str2% && set str2=%str1%)
for /f "tokens=1* delims=:" %%i in ('fomdstr /n ".*" %~nxfile%') do (
    if "%%i" geq "!str1!" if "%%i" leq "!!str2" echo %%j
)
pause
1."%row:~0,1%"==""  想检测要提取的行的数字吗.如果是从第20到30呢?
2."str1" gtr "str2"  这样做会判断"str1"是否大于"srt2".在这里是常最,不是变量,如果要对比变量得加上%
3.%~nxfile%  我不知道你为什么这么用.建议仔细阅读一下 for/?
4.if "%%i" geq "!str1!" if "%%i" leq "!!str2" echo %%j
  就语法来讲,最好是用()分组:if "%%i" geq "!str1!" (if "%%i" leq "!!str2" (echo %%j))
5."!!str2" 感叹号打错了地方,另外,想调用变量延时得加上:setlocal enabledelayedexpansion

[ 本帖最后由 foxJL 于 2007-12-23 21:59 编辑 ]
作者: newyj    时间: 2007-12-23 22:15

谢谢斑竹耐心的指导
1:我是想去掉空的字符
2:这个是我太粗心了 不好意思
3:这个 我是真不知道 能不能 这样用 还得 多多学习呀
4:和5: 都是 太粗心了
再次 谢谢 斑竹热心的讲解
作者: 随风    时间: 2007-12-24 01:03

也来一个
没有foxjl的简洁,但应该算另一种思路吧.
:
  1. @echo off
  2. set/p file=拖入文件:
  3. set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
  4. for /f "tokens=1,2" %%a in ("%row%") do set rowa=%%a&set rowb=%%b
  5. for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
  6.    set /a saz=1/^(%%a/rowa^),1/^(rowb/%%a^)2>nul&&echo.%%b
  7. )
  8. pause&exit
复制代码

[ 本帖最后由 随风 于 2007-12-24 01:06 编辑 ]
作者: uu2004    时间: 2008-6-23 16:05

版主或者哪位高手朋友能否解释一下各行代码的具体意思吗?不胜感谢!!!
作者: Rstv    时间: 2010-1-14 02:15     标题: 新手,惊叹不已!!随风

答LS并后来人:
利用了除数为0产生错误的原理
而 “saz=”也可 Gone with wind 了。。。

Re: #7
."%row:~0,1%"==""
典型的废话!!第一字为空,整串还不为空??!!




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