标题: [文本处理] [代码征集]批处理读取文件指定行 [打印本页]
作者: 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.不清除行号.- @echo off
- ::code by foxjl
- ::没有作清除行号的处理,觉得显示行号还是有必要的.
- set/p file=拖入文件:
- set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
- call :start %row%
- :start
- if "%2"=="" call :start %1 %1
- for /l %%i in (%1,1,%2) do (findstr /n .* %file% | findstr "^%%i:")
- echo.完成
- pause>nul&exit
复制代码
2.清除行号- @echo off
- ::code by foxjl
- ::这段代码是清除了行号的.
- set/p file=拖入文件:
- set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
- call :start %row%
- :start
- if "%2"=="" call :start %1 %1
- for /l %%i in (%1,1,%2) do (
- for /f %%j in ('findstr /n .* %file% ^| findstr "^%%i:"') do (
- set "var=%%j" & call set var=%%var:*:=%%
- call echo.%%var%%
- )
- )
- echo.完成
- 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
- @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
复制代码
借鉴一下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的简洁,但应该算另一种思路吧.
:- @echo off
- set/p file=拖入文件:
- set/p row=输入要提取的行(如提取1-5行则输入: 1 5):
- for /f "tokens=1,2" %%a in ("%row%") do set rowa=%%a&set rowb=%%b
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
- set /a saz=1/^(%%a/rowa^),1/^(rowb/%%a^)2>nul&&echo.%%b
- )
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |