Board logo

标题: [文本处理] [已解决]批处理如何读取文本中指定行列的数据? [打印本页]

作者: mxxcgzxxx    时间: 2011-4-24 17:15     标题: [已解决]批处理如何读取文本中指定行列的数据?

本帖最后由 mxxcgzxxx 于 2011-4-24 22:31 编辑

有一文本“练习文档.txt”内容如下,列间隔为“TAB”
  1. -------编号-------单位----------计算机名----------工作组--------IP-----权限---
  2. 1 中    小 校    长 中小备课组 10 4
  3. 2 中    小 教    导 中小备课组 11 4
  4. 3 中    小 语文组一 中小备课组 51 3
  5. 4 中    小 语文组二 中小备课组 52 3
  6. 5 幼 儿 园 园    长 MSHOME    182 1
  7. 6 网络教室 教 师 机 DNS       200 3
  8. 7 网络教室 学生机1号 DNS       81 2
  9. 8 网络教室 学生机2号 DNS       82 2
复制代码
我做了一个读取菜单,可以读到第一和三列信息,但要通过选择可以临时读取出相应位置的“工作组”“IP”和“权限”
有试过FOR读取所有信息备用但,但有几百台机子时函数就太多了,所以想用谁读谁,不用的不读。
帮我改改看!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :1
  4. cls
  5. 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)
  6. set /a r=%m%+1
  7. set /a t=%m%+2
  8. echo %r% 重新选择
  9. echo %t% 退出
  10. echo.
  11. echo.
  12. echo.
  13. echo.
  14. set /p p=请选择:
  15. if %P%==%r% goto :1
  16. if %p%==%t% goto :next
  17. cls
  18. rem 此处添加代码读取相应位置的数据:工作组=%g% ,IP=%ip%,权限=%qx%
  19. echo 计算机名为:!a%p%!
  20. echo 工作组为  :%g%
  21. echo IP地址为  :%ip%
  22. echo 网络权限为:%qx%
  23. pause
  24. goto :1
  25. :next
复制代码

作者: batman    时间: 2011-4-24 19:44

本帖最后由 batman 于 2011-4-24 23:13 编辑
  1. @echo off
  2. call :get_tab tab
  3. for /f "skip=1 tokens=1-6 delims=%tab%" %%1 in (练习文档.txt) do (
  4.     set ".%%1=%%3"&set "_%%1=计算机名为tab:"%%3" 工作组名为tab:"%%4" IP地址为tab:"%%5" 网格权限为tab:"%%6""
  5.     set /a num=%%1
  6. )
  7. :again
  8. setlocal enabledelayedexpansion
  9. cls&echo,&echo,
  10. for /l %%a in (1,1,%num%) do (
  11.     set/p=^(%%a^)%tab%!.%%a!%tab%<nul&set /a n=%%a%%3
  12.     if !n! equ 0 echo,
  13. )
  14. echo,&echo,&set /p select=请输入要调取信息的主机序号(可选择多项但请用空格格开):
  15. for %%a in (%select%) do (
  16.     cls&echo,&echo,
  17.     for %%a in (!_%%a!) do (
  18.         set "str=%%a"&set "str=!str:tab:"=%tab%:!"
  19.         echo !str:~,-1!&echo,
  20.     )
  21.     pause
  22. )
  23. cls,&echo,&echo,
  24. echo %tab%^(1^)%tab%再次调取%tab%^(2^)%tab%退出
  25. set /p select1=%tab%
  26. if "%select1%" equ "1" endlocal&goto again
  27. goto :eof
  28. %------------------制表符获取函数------------------%
  29. :get_tab
  30. for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined tab set "%1=%%a"
  31. call,set "%1=%%%1:~,-1%%"
  32. %------------------制表符获取函数------------------%
复制代码

作者: mxxcgzxxx    时间: 2011-4-24 21:15

本帖最后由 mxxcgzxxx 于 2011-4-24 22:41 编辑

我在FOR中加入IF测试有通过,
不知有没有效率更高点的指令,可以直达规定的行列?
  1. 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. :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

玩一下,思路为主:
  1. @echo off&setlocal enabledelayedexpansion
  2. call :get_tab tab
  3. echo;
  4. set 2>nul /p set=从0开始记列,最多十项,显示的顺序取决于输入的顺序。%tab%%tab%【请输入要读取的列序号[..........]】: 
  5. for /l %%a in (0,1,9) do (
  6. set read=!read!%%!set:~%%a,1!%tab%
  7. )
  8. for /f "delims=^!" %%a in ("!read:%%%tab%=!") do set read=%%a
  9. cls
  10. for /f "skip=1 tokens=1-8* delims=%tab%" %%0 in (3.txt) do echo %read:~0,-1%
  11. pause&exit
  12. :get_tab
  13. for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined tab set "%1=%%a
  14. call,set "%1=%%%1:~,-1%%"
复制代码

作者: mxxcgzxxx    时间: 2011-4-24 22:50

我一直没看懂下面这一段的意思能给我解释一下吗?
  1. call :get_tab tab
  2. :get_tab
  3. for /f "skip=39 delims=T" %%a in (%windir%\system32\MsDtc\Trace\msdtcvtr.bat) do if not defined tab set "%1=%%a
  4. 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吧,不过不通用:
  1. sed -i "s/【\x74\x61\x62】/\x9/g" %0
复制代码





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