[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [代码征集]批处理读取文件指定行

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

补充说明:1、代码简洁,通用性较高;2、可以处理空行;3、最好封装成函数(封装出来的函数,请另开一帖)

空行怎么弄不知道,用"delims=“会忽略空行。
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

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 编辑 ]

TOP

代码精炼啊!
呵呵
这样就不会忽略空行了。
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

bu错哈,如果不出现1:2:3:就好看了

TOP

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

是故意不去掉的。如果
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

  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 编辑 ]

TOP

兄弟的代码似乎没有测试过.有明显错误的地方.

TOP

恩 是的 还请斑竹 指教 谢谢了

TOP

指教可不敢当.大家一起学习嘛.
就我明眼看到的错误说说吧:
@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 编辑 ]

TOP

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

TOP

也来一个
没有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 编辑 ]
技术问题请到论坛发帖求助!

TOP

版主或者哪位高手朋友能否解释一下各行代码的具体意思吗?不胜感谢!!!

TOP

新手,惊叹不已!!随风

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

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

TOP

返回列表