标题: [文本处理] [已解决]批处理如何读取文本中指定行列的数据? [打印本页]
作者: mxxcgzxxx 时间: 2011-4-24 17:15 标题: [已解决]批处理如何读取文本中指定行列的数据?
本帖最后由 mxxcgzxxx 于 2011-4-24 22:31 编辑
有一文本“练习文档.txt”内容如下,列间隔为“TAB”- -------编号-------单位----------计算机名----------工作组--------IP-----权限---
- 1 中 小 校 长 中小备课组 10 4
- 2 中 小 教 导 中小备课组 11 4
- 3 中 小 语文组一 中小备课组 51 3
- 4 中 小 语文组二 中小备课组 52 3
- 5 幼 儿 园 园 长 MSHOME 182 1
- 6 网络教室 教 师 机 DNS 200 3
- 7 网络教室 学生机1号 DNS 81 2
- 8 网络教室 学生机2号 DNS 82 2
复制代码
我做了一个读取菜单,可以读到第一和三列信息,但要通过选择可以临时读取出相应位置的“工作组”“IP”和“权限”
有试过FOR读取所有信息备用但,但有几百台机子时函数就太多了,所以想用谁读谁,不用的不读。
帮我改改看!- @echo off
- setlocal enabledelayedexpansion
- :1
- cls
- for /f "eol=E skip=1 tokens=1,3 delims=【此处换成tab键】" %%i in (练习文档.txt) do (echo %%i %%j)&(set a%%i=%%j)&(set m=%%i)
- set /a r=%m%+1
- set /a t=%m%+2
- echo %r% 重新选择
- echo %t% 退出
- echo.
- echo.
- echo.
- echo.
- set /p p=请选择:
- if %P%==%r% goto :1
- if %p%==%t% goto :next
-
- cls
- rem 此处添加代码读取相应位置的数据:工作组=%g% ,IP=%ip%,权限=%qx%
- echo 计算机名为:!a%p%!
- echo 工作组为 :%g%
- echo IP地址为 :%ip%
- echo 网络权限为:%qx%
- pause
- goto :1
- :next
复制代码
作者: batman 时间: 2011-4-24 19:44
本帖最后由 batman 于 2011-4-24 23:13 编辑
- @echo off
- call :get_tab tab
- for /f "skip=1 tokens=1-6 delims=%tab%" %%1 in (练习文档.txt) do (
- set ".%%1=%%3"&set "_%%1=计算机名为tab:"%%3" 工作组名为tab:"%%4" IP地址为tab:"%%5" 网格权限为tab:"%%6""
- set /a num=%%1
- )
- :again
- setlocal enabledelayedexpansion
- cls&echo,&echo,
- for /l %%a in (1,1,%num%) do (
- set/p=^(%%a^)%tab%!.%%a!%tab%<nul&set /a n=%%a%%3
- if !n! equ 0 echo,
- )
- echo,&echo,&set /p select=请输入要调取信息的主机序号(可选择多项但请用空格格开):
- for %%a in (%select%) do (
- cls&echo,&echo,
- for %%a in (!_%%a!) do (
- set "str=%%a"&set "str=!str:tab:"=%tab%:!"
- echo !str:~,-1!&echo,
- )
- pause
- )
- cls,&echo,&echo,
- echo %tab%^(1^)%tab%再次调取%tab%^(2^)%tab%退出
- set /p select1=%tab%
- if "%select1%" equ "1" endlocal&goto again
- goto :eof
- %------------------制表符获取函数------------------%
- :get_tab
- for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined tab set "%1=%%a"
- call,set "%1=%%%1:~,-1%%"
- %------------------制表符获取函数------------------%
复制代码
作者: mxxcgzxxx 时间: 2011-4-24 21:15
本帖最后由 mxxcgzxxx 于 2011-4-24 22:41 编辑
我在FOR中加入IF测试有通过,
不知有没有效率更高点的指令,可以直达规定的行列?- for /f "eol=E skip=1 tokens=1,4,5,6 delims=【此处换成TAB】" %%i in (练习文档.txt) do (if %p%==%%i (set g=%%j)&(set ip=%%k)&(set qx=%%l)&(goto :2))
-
- :2
复制代码
作者: mxxcgzxxx 时间: 2011-4-24 21:19
本帖最后由 mxxcgzxxx 于 2011-4-24 21:33 编辑
还有为什么我发的是“delims= ”=号后是TAB,而到了论坛里就加上了空格??
是BUG吗?
感谢batman,比我编的强大得多了呵,不过有些我还看不太懂,学习学习,我自己研究破解下!
作者: Batcher 时间: 2011-4-24 21:22
4# mxxcgzxxx
DZ论坛会自动把制表符转换成空格
作者: CrLf 时间: 2011-4-24 22:37
玩一下,思路为主:- @echo off&setlocal enabledelayedexpansion
- call :get_tab tab
- echo;
- set 2>nul /p set=从0开始记列,最多十项,显示的顺序取决于输入的顺序。%tab%%tab%【请输入要读取的列序号[..........]】:
- for /l %%a in (0,1,9) do (
- set read=!read!%%!set:~%%a,1!%tab%
- )
- for /f "delims=^!" %%a in ("!read:%%%tab%=!") do set read=%%a
- cls
- for /f "skip=1 tokens=1-8* delims=%tab%" %%0 in (3.txt) do echo %read:~0,-1%
- pause&exit
-
- :get_tab
- for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined tab set "%1=%%a
- call,set "%1=%%%1:~,-1%%"
复制代码
作者: mxxcgzxxx 时间: 2011-4-24 22:50
我一直没看懂下面这一段的意思能给我解释一下吗?- call :get_tab tab
-
- :get_tab
-
- for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined tab set "%1=%%a
-
- call,set "%1=%%%1:~,-1%%"
复制代码
作者: CrLf 时间: 2011-4-24 22:54
本帖最后由 zm900612 于 2011-4-24 22:56 编辑
7# mxxcgzxxx
batman发明的获取tab的函数,原帖链接:
http://bbs.bathome.net/thread-12054-1-1.html
从windows共有的系统文件中提取制表符
作者: mxxcgzxxx 时间: 2011-4-24 23:04
8# zm900612
原来如此,是很无奈的做法呵呵,有没有可以用CMD直接读取ASCII码的方法啊
作者: CrLf 时间: 2011-4-24 23:14
本帖最后由 zm900612 于 2011-4-24 23:18 编辑
也可以考虑用sed吧,不过不通用:- sed -i "s/【\x74\x61\x62】/\x9/g" %0
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |