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

【出题】批处理替换文本中的连续空格

替换文本中的连续空格
a.txt中有连续的空格,数量不确定,但最多不会超过100个
现要求将所有连续空格替换成一个空格,问如何才能用最少的替换次数达到要求?
比如先替换4个为1个,再替换3个为1个..... 还是先替换2个为1个,再替换3个为1个...
好像这成了一个数学题目,呵呵.....
.
完整题目是这样,有兴趣的可以练练手
a.txt中有连续空格,连续空行,有只有空格(包括全角的)的空行(视为空行)
要求是
合并连续空行,连续空格,去除首尾空格(包括全角的)
只有空格(包括全角的)的行也算空行.
忽略以abc或123或456开头的行,注意:前面有空格的也要忽略. 比如 空格abc
文本中含有\和/符号,无其它特殊字符.
技术问题请到论坛发帖求助!

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (1.txt) do (
  3.     set "str=%%a"
  4.     if not "!str:~0,3!"=="123" (if not "!str:~0,3!"=="456" (if not "!str:~0,3!"=="abc" echo %%a>>2.txt)))
  5. for /f "tokens=1* delims= " %%a in (2.txt) do set "head=%%a"&set "tail=%%b"&call :lp "%%b"
  6. pause&exit
  7. :lp
  8. for /f "tokens=1* delims= " %%i in ("!tail!") do (
  9.       set "head=!head! %%i"&set "tail=%%j"
  10.       if not "!tail!"=="" (goto lp) else echo !head!>>final.txt
  11. )
复制代码
Still with wax

TOP

处理大文件还是效率有问题
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (abc 123 456) do set _%%i=i
  3. for /f "tokens=2 delims=:" %%i in ('findstr /n .* "1.txt"') do (
  4.    set "str="
  5.    for %%a in (%%i) do if defined str (set str=!str! %%a)else set str=%%a
  6.        if defined str (
  7.           for %%a in ("!str:~,3!") do if not defined _%%~a echo !str!&set k=
  8.         ) else if not defined k echo;&set "k=k"
  9.     )
  10. pause
复制代码

TOP

围观

  1. gawk "$1=$1" a.txt
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4楼 的帖子

晕死,第三方好简单啊……
Still with wax

TOP

回复 1楼 的帖子

希望 随风兄 给个例子。
(*^_^*)

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=*" %%a in (a.txt) do (
  3.     set str=%%a
  4.     for %%b in (abc 123 456) do (if "!str:~,3!" equ "%%b" set str=)
  5.     set res=
  6.     for %%b in (!str!) do set res=!res! %%b
  7.     if defined res echo !res:~1!
  8. ))>a_2.txt
复制代码

TOP

第三方用的好就是让人羡慕啊!
不过大家都把不连续的空行删除了,难道是我没说清楚?
技术问题请到论坛发帖求助!

TOP

我上面应该是保留一行的啊

TOP

回复 9楼 的帖子

你没测试的吧.^_^
技术问题请到论坛发帖求助!

TOP

对于 忽略以abc或123或456开头的行 是直接删除呢 还是不处理连续空格但不删除呢
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (abc 123 456) do set _%%i=i
  3. for /f "tokens=1* delims=:" %%i in ('findstr /n .* "1.txt"') do (
  4.    set str=
  5.    for %%a in (%%j) do if defined str (set str=!str! %%a) else set str=%%a
  6.        if defined str (
  7.           for %%a in ("!str:~,3!") do if not defined _%%~a (echo !str!)else echo %%j
  8.           set "k="
  9.         ) else if not defined k echo;&set "k=k"
  10.     )
  11. pause
复制代码

[ 本帖最后由 terse 于 2009-9-24 14:14 编辑 ]
2

评分人数

    • 随风:PB + 5
    • wxcute: 思路和你差不多,不过没你的代码好。PB + 5

TOP

我做连续空格的

不管有没有,
1。把所有 的两个空格"  "  替换成 "我是两个空格"
2。大于2又是奇数,咋整?后面一定有1个空格没化,先把  "我是两个空格"+1个空格 干掉
3。剩下的如果有,就全都是"我是两个空格了",全刷。

这样操作用数字表示:
1。如果除2余1  干掉对应的那个1
2。可以除2的都干掉

独立的那个1 我可没碰。

[ 本帖最后由 523066680 于 2009-9-24 19:01 编辑 ]

TOP

  1. @echo off
  2. set "str=12 123   456                   789"
  3. set "str=%str:  =我是两个空格%"
  4. set "str=%str:我是两个空格 =%"
  5. echo,%str:我是两个空格=%
  6. pause
复制代码
至于大于2的连续空格有多少个,就不用管了。


用第三方,人家第三方的编写里面也要一段代码呀,现在做的代码弄成函数不是也可以实现一句话搞定么?
我以为,应以当前方便为主。
如果第三方已经存在了,当然用第三方方便了,第三方字符处理也好一些~
话说还有vbs……            (请原谅我用以上描述性的语言赚回帖分……)
                                                                                         ------IF_EXIST

[ 本帖最后由 523066680 于 2009-9-24 18:53 编辑 ]

TOP

回头看了一下,表情愣然:


原来要求不止于此,我太天真了。

[ 本帖最后由 523066680 于 2009-9-24 18:49 编辑 ]

TOP

这次应该全部合楼主的题意了吧!

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=*" %%a in ('findstr /n .* a.txt') do (
  3.     set abc=%%a
  4.     set str=!abc:*:=!
  5.     if not defined str set kon=y
  6.     for /f "tokens=* delims=  " %%b in ("!str!") do (set str=%%b
  7.                 for %%c in (abc 123 456) do (if "!str:~,3!" equ "%%c" set str=)
  8.                 if defined str (
  9.                         set res=
  10.                         for %%c in (!str!) do set res=!res! %%c
  11.                         if defined res (
  12.                                 if defined kon echo;
  13.                                 echo;!res:~1!
  14.                                 set kon=
  15.                         )
  16.                 ) else (
  17.                         if "%%b" equ "" (set kon=y) else (
  18.                                 if defined kon echo;
  19.                                 echo;!abc:*:=!
  20.                                 set kon=
  21.                         )
  22.                 )
  23.         )
  24. ))>a_2.txt
  25. start a_2.txt
复制代码

TOP

返回列表