返回列表 发帖

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

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




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

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

TOP

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

TOP

抛砖引玉
@echo off
for /f "delims=" %%a in (%~0) do (
    set str=%%a
    setlocal enabledelayedexpansion
    if "!str:~8!" equ "" (
        for /l %%b in (0,1,7) do (
                if "!str:~%%b,1!" neq "" (
                        if "!str:~%%b,1!0" gtr "z" (set/a len+=2) else (set/a len+=1)
                                        rem     ^ 这个字符用小于最小全角字符的即可,这知是不是z
                )
        )
    )
    if !len! equ 8 echo;!str!
    endlocal
)
pause
rem 后面的是例子
:2345678
::批处理
::!!!!!!
::^"!!|>
::物><!%
:23456789
::批处理1
::!!!!!!1
::^"!!|>1
::物><!%1COPY
1

评分人数

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

TOP

回复 4楼 的帖子

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

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

TOP

解决分号问题了
@echo off
for /f "tokens=* delims=;" %%a in ('findstr /n .* %0') do (
    set str=%%a
    setlocal enabledelayedexpansion
    set "str=!str:*:=!"
    if "!str:~8!" equ "" (
        for /l %%b in (0,1,7) do (
                if "!str:~%%b,1!" neq "" (
                        if "!str:~%%b,1!0" gtr "z" (set/a len+=2) else (set/a len+=1)
                                        rem     ^ 这个字符用小于最小全角字符的即可,这知是不是z
                )
        )
    )
    if !len! equ 8 echo;!str!
    endlocal
)
pause
rem 后面的是例子
:2345678
::批处理
::!!!!!!
::^"!!|>
::物><!%
:23456789
::批处理1
::!!!!!!1
::^"!!|>1
::物><!%1
;dddddddCOPY

TOP

回复 6楼 的帖子

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

TOP

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

TOP

回复 8楼 的帖子

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

TOP

高效的,可处理绝大部分字符
@echo off
for /f "tokens=*" %%a in ('^(type %0^&echo.^)^|findstr /o .*') do (
    set str=%%a
    setlocal enabledelayedexpansion
    for /f "delims=:" %%b in ("!str!") do (
                set/a len=%%b-up-2
                if !len! equ 8 echo !ech!
                    set "ech="
                for %%c in ("!str:*:=!") do (
                        endlocal&set up=%%b&set ech=%%~c
    ))
)
pause
rem 后面的是例子
:2345678
::批处理
::!!!!!!
::^"!!|>
::物><!%
:23456789
::批处理1
::!!!!!!1
::^"!!|>1
::物><!%1
;dddddddCOPY

TOP

回复 8楼 的帖子

2楼的方法其实不麻烦,开始没想清楚,变量还是可以保留的
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n /o .* "%~f0"') do (
    for /f "delims=:" %%i in ("%%b") do set m=%%i
    set /a x=m-n
    setlocal enabledelayedExpansion
    if !x!==10 echo !var:*:=!
    endlocal
    set /a n=m
    set var=%%b
)
pause&exit/b
;2345678
^%; <!"
上面是全角空格COPY
命令行参考: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可以自动加空行呀,太好了!
完美代码如下:
@echo off
for /f "tokens=*" %%a in ('^(more %0 ^&echo aa^)^|findstr /o .*') do (
    set str=%%a
    setlocal enabledelayedexpansion
    for /f "delims=:" %%b in ("!str!") do (
        set/a len=%%b-up-2
        if !len! equ 8 echo !ech:*:=!
        endlocal&set/a up=%%b
    )
    set ech=%%a
)
pause
rem 后面的是例子
:2345678
::批处理
::!!!!!!
::^"!!|>
::物><!%
:23456789
::批处理1
::!!!!!!1
::^"!!|>1
::物><!%1
;ddddddd
^%; <!"COPY

TOP

回复 12楼 的帖子

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

TOP

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

TOP

返回列表