楼 主
"小函数"来对文件指定行的读取(ReadLine.bat)
发表于 2007-03-19 05:25 · 中国 湖北 武汉 电信
版主
★★★★★
积分 11,386 发帖 4,938 注册 2006-07-23 17:10 UID 59080
状态 离线
经常要对文件的指定行进行读取,特写了一个读取文件指定行的小程序段(ReadLine.Bat),方面以后调用。
使用也比较简单:"Call ReadLine <文件名> <跳过的行数> <读取行数> "就可以了。比如在一个批处理里加上一句"Call ReadLine a.txt 5 7",那么将跳过a.txt文件的前5行,显示下面的7行字符,也包含空行。也可以不指定第三个参数。
ReadLine.Bat
@echo off&SetLocal ENABLEDELAYEDEXPANSION
if "%1"=="" (goto --help) else (set file=%~s1)
if "%2"=="" (set first="delims=: tokens=1*") else (set first="skip=%2 delims=: tokens=1*")
if "%3"=="" (
for /f %first% %%a in ('findstr /n .* %file%') do echo/%%b
goto :EOF
)
set last=%3
set loop=0
for /f %first% %%a in ('findstr/n .* %file%') do (
if not defined lxmxn (echo/%%b&set /a loop+=1) else (goto :EOF)
if "!loop!"=="%last%" set lxmxn=Nothing
)
GOTO :EOF
:--help
echo/======================================
echo/本程序段需要带参数才能正常运行
echo/&echo/Usage:&echo/Call ReadLine ^<文件名^> ^<跳过行数^> ^<读取行数^>
echo/&echo/例如:call ReadLine aa.txt 5 7 ,将跳过aa.txt文件的前5行,读取下面的7行字符
echo/&echo/如果^<跳过行数^>没有指定,就从文件第一行读取
echo/&echo/指定^<读取行数^>时必须指定^<跳过行^>
echo/======================================
goto :eof
第 2 楼
发表于 2007-03-19 05:28 · 中国 河北 保定 联通
银牌会员
★★★
积分 1,513 发帖 554 注册 2005-12-30 00:50 UID 48180 性别 男
状态 离线
第 3 楼
发表于 2007-03-19 07:00 · 中国 甘肃 张掖 电信
金牌会员
★★★★
积分 4,103 发帖 1,744 注册 2006-01-20 13:00 UID 49241 性别 男 来自 甘肃.临泽
状态 离线
第 4 楼
发表于 2007-03-19 07:18 · 中国 湖北 武汉 电信
版主
★★★★★
积分 11,386 发帖 4,938 注册 2006-07-23 17:10 UID 59080
状态 离线
Originally posted by vkill at 2007-3-18 18:00:
我不知道要是处理N W行的文件效率怎么样
兄的这个问题倒没有想过,估计这个小函数只能处理一些小的文本吧,大了就不行啦。
第 5 楼
发表于 2007-03-20 00:12 · 中国 安徽 马鞍山 电信
中级用户
★★
积分 493 发帖 228 注册 2007-02-16 00:38 UID 79596 性别 男 来自 安徽
状态 离线
第 6 楼
发表于 2007-03-20 02:19 · 中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493 发帖 2,672 注册 2005-09-02 00:00 UID 42173 性别 男
状态 离线
支持,顶
C:\> BLOG http://initiative.yo2.cn/
C:\> hh.exe ntcmds.chm::/ntcmds.htm
C:\> cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll /10/5432'>"
第 7 楼
发表于 2007-07-09 13:30 · 中国 湖北 武汉 电信
初级用户
★
小子
积分 76 发帖 26 注册 2007-06-20 19:30 UID 91913 性别 男
状态 离线
我暂时想不到用版主的文件只读取第一行的方法,所以擅自改动了一下,把参数2和参数3换了一下位置,用ReadLine a.txt 1即可读取第一行,用ReadLine a.txt 1 1读取第二行。谢谢版主,这个文件很好用,同时还望版主见谅。
@echo off&SetLocal ENABLEDELAYEDEXPANSION
if "%1"=="" (goto --help) else (set file=%~s1)
if "%3"=="" (set first="delims=: tokens=1*") else (set first="skip=%3 delims=: tokens=1*")
if "%2"=="" (
for /f %first% %%a in ('findstr /n .* %file%') do echo/%%b
goto :EOF
)
set last=%2
set loop=0
for /f %first% %%a in ('findstr/n .* %file%') do (
if not defined lxmxn (echo/%%b&set /a loop+=1) else (goto :EOF)
if "!loop!"=="%last%" set lxmxn=Nothing
)
GOTO :EOF
:--help
echo/======================================
echo/本程序段需要带参数才能正常运行
echo/&echo/Usage:&echo/Call ReadLine ^<文件名^> ^<读取行数^> ^<跳过行数^>
echo/&echo/例如:call ReadLine aa.txt 5 7 ,将跳过aa.txt文件的前7行,读取下面的5行字符
echo/&echo/如果^<跳过行数^>没有指定,就从文件第一行读取
echo/======================================
goto :eof
[
Last edited by tclgb on 2007-7-9 at 01:31 PM ]
第 8 楼
发表于 2007-07-09 14:55 · 中国 山东 滨州 联通
初级用户
★
积分 60 发帖 23 注册 2007-07-05 00:44 UID 93170 性别 男
状态 离线
Originally posted by tclgb at 2007-7-9 01:30 PM:
我暂时想不到用版主的文件只读取第一行的方法,所以擅自改动了一下,把参数2和参数3换了一下位置,用ReadLine a.txt 1即可读取第一行,用ReadLine a.txt ...
跳过行数是零不就能读取第一行了吗?
龙飞电脑网络 中国厨房设备联盟 www.59fei.com
www.chufangshebei.com
第 9 楼
发表于 2007-07-09 15:49 · 中国 广东 深圳 电信
高级用户
★★★
积分 793 发帖 312 注册 2004-09-02 00:00 UID 31104 性别 男
状态 离线
第 10 楼
发表于 2007-07-09 21:25 · 中国 湖北 武汉 电信
初级用户
★
小子
积分 76 发帖 26 注册 2007-06-20 19:30 UID 91913 性别 男
状态 离线
Re:59fei
59fei兄可以运行原文件的ReadLine a.txt 0 1,看有什么提示,在我这里会提示错误
第 11 楼
发表于 2007-07-09 21:32 · 中国 甘肃 兰州 电信
初级用户
★
积分 26 发帖 14 注册 2007-07-07 22:54 UID 93416 性别 男
状态 离线
第 12 楼
发表于 2008-07-25 14:10 · 中国 河南 洛阳 联通
新手上路
★
积分 4 发帖 2 注册 2008-07-25 08:31 UID 122050 性别 男
状态 离线
你这个写的有点复杂。其实解决办法可以简化一点。
@echo off
setlocal EnableDelayedExpansion
set loop=0
set /a skipline=%2-1
for /f "tokens=1 skip=%skipline% delims=" %%a in (%1) do (
set /a loop=!loop!+1
if "!loop!" leq "%3" (echo %%a) else goto :eof
)
goto :eo
第 13 楼
发表于 2022-07-04 16:14 · 中国 广东 广州 电信
新手上路
★
积分 1 发帖 1 注册 2018-04-08 10:55 UID 182752 性别 男
状态 离线
测试以上各楼层大神的版本,好像用起来总有点不手,擅自改动如下,自用时目前满足所有情况,还请多指教。
:ReadLine <DataFileName> <skipline> <readline>
:: DataFileName 待读入文件
:: skipline 跳过行数,空或非有效数字则默认为0
:: readline 读取行数,空或非有效数字则默认为0,0则表示为剩余的全部
@echo off&SetLocal ENABLEDELAYEDEXPANSION
if "%1"=="" goto :--help
set /a loop=0
set /a skipline=%~2+0
set /a readline=%~3+0
if %skipline% lss 1 (
set "for_var=usebackq tokens=1 delims="
) else (
set "for_var=usebackq tokens=1 skip=%skipline% delims="
)
if %readline% lss 1 (
set /a step=0
set /a readline=1
) else (
set /a step=1
)
for /f "%for_var%" %%a in ("%~f1") do (
set /a loop+=step
if !loop! leq %readline% (echo %%a) else goto :eof
)
goto :eof
:--help
echo/======================================
echo / 本程序段需要带参数才能正常运行
echo/&echo/Usage:&echo/Call ReadLine ^<文件名^> ^<跳过行数^> ^<读取行数^>
echo/&echo / 例如:call ReadLine aa.txt 5 7 ,将跳过 aa.txt 文件的前 5 行,读取下面的 7 行字符
echo/&echo / 如果 ^<跳过行数^> 没有指定,就从文件第一行读取
echo/&echo / 指定 ^<读取行数^> 时必须指定 ^<跳过行^>
echo/======================================
goto :eof
论坛跳转:
— 请选择 —
站务公告 & 版主讨论
意见反馈 & 网友交流
DOS学习入门 & 精彩文章 (教学室)
DOS疑难解答 & 问题讨论 (解答室)
DOS启动盘 & LOGO技术 (启动盘室)
DOS批处理 & 脚本技术(批处理室)
DOS媒体世界 & 网络技术 (多媒体室)
DOS汉化世界 & 中文系统 (中文化室)
DOS开发编程 & 发展交流 (开发室)
DOS软件下载 & 游戏分享 (下载室)
GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区
其它操作系统综合讨论区
WinPE、PowerShell及其它命令行系统专区
贴图灌水、文学娱乐专区
网络日志(Blog)
论坛回收站
├ 链接失效,待修正