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

[文本处理] 【练习】批处理显示文本中8字节的行

在百度贴吧看到一题,出给大家练练手。
那儿有一仙说他们老大不加思索就作出来了,(本人足足想了10分钟才有完整思路)实在对这位老大佩服的很,可惜未见到代码 (^_^)
题:
要求显示a.txt中8字节的行,注意有特殊字符 ^%&<!>等。
增加要求为:不创建临时文件,不使用第三方工具。
注意:说的是字节而不是字符,需考虑到多种情况,比如冒号、分号开头的行。。。




.
技术问题请到论坛发帖求助!

我首先想到的思路是:for /f 解析 findstr /o 做减法
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

小水一个:不创建临时文件就确实加大了难度了,呵呵,看看大家的思路吧。。。
***共同提高***

TOP

抛砖引玉
  1. @echo off
  2. for /f "delims=" %%a in (%~0) do (
  3.     set str=%%a
  4.     setlocal enabledelayedexpansion
  5.     if "!str:~8!" equ "" (
  6.         for /l %%b in (0,1,7) do (
  7.                 if "!str:~%%b,1!" neq "" (
  8.                         if "!str:~%%b,1!0" gtr "z" (set/a len+=2) else (set/a len+=1)
  9.                                         rem     ^ 这个字符用小于最小全角字符的即可,这知是不是z
  10.                 )
  11.         )
  12.     )
  13.     if !len! equ 8 echo;!str!
  14.     endlocal
  15. )
  16. pause
  17. rem 后面的是例子
  18. :2345678
  19. ::批处理
  20. ::!!!!!!
  21. ::^"!!|>
  22. ::物><!%
  23. :23456789
  24. ::批处理1
  25. ::!!!!!!1
  26. ::^"!!|>1
  27. ::物><!%1
复制代码
1

评分人数

    • 随风: 未考虑分号开头的行PB + 5

TOP

回复 4楼 的帖子

先忽略8个字符以上的行,再逐字判断,不错,但若需显示的行不是8字节而是更大点的数,效率会同时降低,且未考虑分号开头的行和含全角空格的行。
先加5分,后面的继续。。。

[ 本帖最后由 随风 于 2009-6-10 19:19 编辑 ]
技术问题请到论坛发帖求助!

TOP

解决分号问题了
  1. @echo off
  2. for /f "tokens=* delims=;" %%a in ('findstr /n .* %0') do (
  3.     set str=%%a
  4.     setlocal enabledelayedexpansion
  5.     set "str=!str:*:=!"
  6.     if "!str:~8!" equ "" (
  7.         for /l %%b in (0,1,7) do (
  8.                 if "!str:~%%b,1!" neq "" (
  9.                         if "!str:~%%b,1!0" gtr "z" (set/a len+=2) else (set/a len+=1)
  10.                                         rem     ^ 这个字符用小于最小全角字符的即可,这知是不是z
  11.                 )
  12.         )
  13.     )
  14.     if !len! equ 8 echo;!str!
  15.     endlocal
  16. )
  17. pause
  18. rem 后面的是例子
  19. :2345678
  20. ::批处理
  21. ::!!!!!!
  22. ::^"!!|>
  23. ::物><!%
  24. :23456789
  25. ::批处理1
  26. ::!!!!!!1
  27. ::^"!!|>1
  28. ::物><!%1
  29. ;ddddddd
复制代码

TOP

回复 6楼 的帖子

全角空格呢?   (^_^)
技术问题请到论坛发帖求助!

TOP

考虑到所有特殊字符的情况后,2楼说的方法实现起来还真有点麻烦。
先来个代码简单但效率超低的方法
  1. @echo off
  2. set var2=.
  3. for /f "usebackq delims=" %%a in ("%~f0") do (
  4.     set var=%%a
  5.     set var|findstr /o ".*"|findstr /b "14:" >nul && (
  6.         setlocal enabledelayedExpansion
  7.         echo !var!
  8.         endlocal
  9.     )
  10. )
  11. pause&exit/b
  12. :2345678
  13. ^%; <!"
  14. 上面是全角空格
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 8楼 的帖子

效率是够低的,也每考虑分号开头的行 (^_^)
技术问题请到论坛发帖求助!

TOP

高效的,可处理绝大部分字符
  1. @echo off
  2. for /f "tokens=*" %%a in ('^(type %0^&echo.^)^|findstr /o .*') do (
  3.     set str=%%a
  4.     setlocal enabledelayedexpansion
  5.     for /f "delims=:" %%b in ("!str!") do (
  6.                 set/a len=%%b-up-2
  7.                 if !len! equ 8 echo !ech!
  8.                     set "ech="
  9.                 for %%c in ("!str:*:=!") do (
  10.                         endlocal&set up=%%b&set ech=%%~c
  11.     ))
  12. )
  13. pause
  14. rem 后面的是例子
  15. :2345678
  16. ::批处理
  17. ::!!!!!!
  18. ::^"!!|>
  19. ::物><!%
  20. :23456789
  21. ::批处理1
  22. ::!!!!!!1
  23. ::^"!!|>1
  24. ::物><!%1
  25. ;ddddddd
复制代码

TOP

回复 8楼 的帖子

2楼的方法其实不麻烦,开始没想清楚,变量还是可以保留的
  1. @echo off
  2. for /f "tokens=1* delims=:" %%a in ('findstr /n /o .* "%~f0"') do (
  3.     for /f "delims=:" %%i in ("%%b") do set m=%%i
  4.     set /a x=m-n
  5.     setlocal enabledelayedExpansion
  6.     if !x!==10 echo !var:*:=!
  7.     endlocal
  8.     set /a n=m
  9.     set var=%%b
  10. )
  11. pause&exit/b
  12. ;2345678
  13. ^%; <!"
  14. 上面是全角空格
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

晕,findstr /n 写习惯了,%%a根本没用到~~
for /f "delims=" %%a in ('findstr /o .* "%~f0"') do


方法都一样,被netbenton兄抢先了,而且考虑到了最后一行没有回车的情况。
"tokens=*"改成"delims="就兼容所有字符了。
可以用more "%~f0"|findstr /o .*更简洁点,more会在文本内容后面加额外的回车。

[ 本帖最后由 zqz0012005 于 2009-6-10 20:57 编辑 ]
1

评分人数

    • 随风: 点睛之笔 (^_^)PB + 11
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

re zqz0012005
我正找了半天,怎么解最后一行不是空格的问题呢!
原来用more可以自动加空行呀,太好了!
完美代码如下:
  1. @echo off
  2. for /f "tokens=*" %%a in ('^(more %0 ^&echo aa^)^|findstr /o .*') do (
  3.     set str=%%a
  4.     setlocal enabledelayedexpansion
  5.     for /f "delims=:" %%b in ("!str!") do (
  6.         set/a len=%%b-up-2
  7.         if !len! equ 8 echo !ech:*:=!
  8.         endlocal&set/a up=%%b
  9.     )
  10.     set ech=%%a
  11. )
  12. pause
  13. rem 后面的是例子
  14. :2345678
  15. ::批处理
  16. ::!!!!!!
  17. ::^"!!|>
  18. ::物><!%
  19. :23456789
  20. ::批处理1
  21. ::!!!!!!1
  22. ::^"!!|>1
  23. ::物><!%1
  24. ;ddddddd
  25. ^%; <!"
复制代码

TOP

回复 12楼 的帖子

zqz 真是一语点醒梦中人,代码早以写好,就是解决不了最后一行没有回车的问题。老是用type
最终大家的思路都到一起来了 (^_^)
代码如下:
  1. @echo off&set /a h=0
  2. for /f "delims=" %%a in ('^(more %~s0^&echo.^)^|findstr /o .*') do (
  3.    for /f "delims=:" %%i in ("%%a") do set /a n=%%i-2-h,h=%%i
  4.    setlocal enabledelayedexpansion
  5.    if !N! equ 8 echo;【!var:*:=!】
  6.    endlocal
  7.    set "var=%%a"
  8. )
  9. pause&exit
  10. 下面是分号开头的行
  11. ;1234567
  12. 下面是8个空格
  13.         
  14. 下面是冒号开头的行
  15. ::::::::
  16. 下面是特殊字符的行
  17. %^&*<">!
  18. 下面是含全角空格的行
  19.    78
  20. 下面是全角半角混合的行
  21. 壹23肆78
  22. 下面是纯半角字符的行
  23. 12345678
复制代码
技术问题请到论坛发帖求助!

TOP

忘了,最后还要自己加一行,以应付最后一行也是8个字节的情况。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表