返回列表 发帖

【练习-037】批处理去除文本行前后的空格

  因为论坛练习题系列中确实缺少37题(这是本人的过失),所以就
以本题来做为37题吧。有文本a.txt如下:
amd cx qu      
    k of woo is qmom                 
      jm ko    ppp     oe    mie    tnnn           
  sis              jb  COPY
  要求通过批处理去除文本行的前后空格(空格数是随机和末知的
,且都为半角空格),输出如下(行的前后请加上引号):
"amd cx qu"
"k of woo is qmom"
"jm ko    ppp     oe    mie    tnnn"
"sis              jb"COPY
  本题满分10分,原则上以思路为重,视情况加分。
       参考答案如下:
@echo off
for /f "delims=" %%a in (a.txt) do set "a="&call :lp "$%%a$"
pause>nul&goto :eof
:lp
for /f "tokens=1* delims= " %%a in ("%a%%~1") do set "str=%%b"&set "var="
for %%a in (%str: = # %) do call,set "var=%%a%%var%%"
if "%~1" neq "" (set "a=%var:#= %"&call :lp) else echo "%var:#= %"COPY


[ 本帖最后由 batman 于 2009-8-15 18:44 编辑 ]
***共同提高***

以前在cn - dos见过这种方法:
@echo off
set "abc=                    33 ff cc                  "
for /f "tokens=*" %%a in ("%abc%") do echo;"%%~nxa"COPY


[ 本帖最后由 batman 于 2009-8-15 18:45 编辑 ]
4

评分人数

TOP

回复 2楼 的帖子

&&震撼!学习了。想不到变量扩展能强到如此地步,
但就是不明白其中的处理机制,希望有高人能明示
一二。
   另请大家不要局限于现有的解决方案,把思路充
分打开,“八仙过海各显神通”,这也是本人不断出
题的初衷了。
***共同提高***

TOP

回复 2楼 的帖子

哪位兄台能否解释一下这样为什么也可以,%%~nxa不是指的文件名及扩展名么?

TOP

用了5个FOR:
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (a.txt) do (
    set str=%%i
    for %%a in (%%i) do set str1=%%a
    for %%h in (!str1!) do (
        for %%m in (!str1!#) do set hh=!str:%%h=%%m!
        for /f "delims=#" %%x in ("!hh!") do echo "%%x"
    )
)
pauseCOPY
1

评分人数

    • batman: 虽然5个for效率还是高PB + 10
(*^_^*)

TOP

只能去掉末尾100个空格,要是大于100个空格,必须改动for /l中的数字,这也是此代码的不合理之处:
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (a.txt) do (
    set str=%%i
    call :lp
)
pause&exit/b
:lp
for /l %%a in (-1 -1 -100) do (
        set "str1=!str:~%%a,1!"
        if not "!str1!"==" " (
           set n=%%a&set /a n+=1
           for %%i in (!n!) do set "str1=!str:~0,%%i!"
           echo "!str1!"&goto :eof
        )
)COPY
1

评分人数

    • batman: 空格是未知的,有可以大于100个PB + 5
(*^_^*)

TOP


测试了下 2L的
发现只需要用~n就好了(用x也许有特殊的情况吧)................................
@echo off
for /f "tokens=*" %%a in (a.txt) do (
echo "%%~na"
)
pauseCOPY
%~nI        - 仅将 %I 扩充到一个文件名
自己想了想
原因也许是:
对于文件名(这里指的是文件夹) win规定了开头和末尾都不允许有空格.......于是有的就自动去掉了
..
用md也无法建立前头和末尾有空格的文件夹
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

对于以上 我的想法
想出了一种dir的方法 建立文件夹 然后删除
这个方法最要命的就是 一定要放在一个没有文件夹的目录下 否则就................
@echo off
for /f "tokens=*" %%a in (1.txt) do (
md "%%a"
for /f "tokens=*" %%t in ('dir /b *.') do echo "%%t"
rd "%%a"
)
pauseCOPY
这道题目等多点人解答 我再放到chm里去^_^
2

评分人数

o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

以上的改进是建立双层的文件夹 呼呼
把思路提出来 以后再改了 做完才想到的
要下网了 8
o(∩_∩)o...~~~
空间:http://hi.baidu.com/fair_jm
喜欢批处理的没事的话去逛逛哦~~

TOP

其实可以创建一个无字节的文件名,方法就是用截取字符串的办法可以把原有的文件名换没了!如:
%str:filename=%

TOP

考虑了特殊情况:即存在":" "<>" "\" "."
@echo off
set "abc=   33 ff c:\ab\exe.ffg  00 0 0-00-><   "
set "abc=%abc:0=-0-%"
set "abc=%abc::=a0%"
set "abc=%abc:\=b0%"
for /f "tokens=*" %%a in ("%abc%") do set "abc=%%~nxa"
set "abc=%abc:b0=\%"
set "abc=%abc:a0=:%"
set "abc=%abc:-0-=0%"
echo;"%abc%"COPY

TOP

@echo off
set "str=   33 ff c:\ab\exe.ffg  echo;00 0 0-00->55.txt<   "
for /f "tokens=*" %%i in ("%str%") do set "str=%%i"
:lp
if "%str:~-1%"==" " set "str=%str:~0,-1%"&goto lp
echo "%str%"
pauseCOPY
1

评分人数

    • batman: 在效率上欠考虑PB + 5

TOP

回复 12楼 的帖子

逐字法效率一直是问题,这点是无法避免的。。。
***共同提高***

TOP

这样效率提高点吧
@echo off
set "str=   33 ff c:\ab\exe.ffg  echo;00 0 0-00->55.txt<   "
for /f "tokens=*" %%i in ("%str%") do (
   for %%j in ("c:\%%i") do set "str=%%~pnxj"
)
echo "%str:~1%"
pauseCOPY

TOP

回复 5楼 的帖子

代码是否可以做如下修改(去掉两个for),但文本中如存在#字符这个代码就挂掉了:
@echo off&setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (a.txt) do (
    set str=%%i
    for %%a in (%%i) do set str1=%%a
    call, set hh=%%str:!str1!=!str1!#%%
    for /f "delims=#" %%x in ("!hh!") do echo "%%x"
)
pauseCOPY

[ 本帖最后由 batman 于 2009-8-15 20:42 编辑 ]
***共同提高***

TOP

返回列表