Board logo

标题: 【出题】批处理替换文本中的连续空格 [打印本页]

作者: 随风    时间: 2009-9-23 06:07     标题: 【出题】批处理替换文本中的连续空格

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

  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. )
复制代码

作者: terse    时间: 2009-9-23 14:46

处理大文件还是效率有问题
  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
复制代码

作者: Batcher    时间: 2009-9-23 14:49     标题: 围观

  1. gawk "$1=$1" a.txt
复制代码

作者: Lumiere    时间: 2009-9-23 14:52     标题: 回复 4楼 的帖子

晕死,第三方好简单啊……
作者: keen    时间: 2009-9-23 17:39     标题: 回复 1楼 的帖子

希望 随风兄 给个例子。
作者: netbenton    时间: 2009-9-23 21:12

  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
复制代码

作者: 随风    时间: 2009-9-24 04:55

第三方用的好就是让人羡慕啊!
不过大家都把不连续的空行删除了,难道是我没说清楚?
作者: terse    时间: 2009-9-24 10:14

我上面应该是保留一行的啊
作者: 随风    时间: 2009-9-24 12:21     标题: 回复 9楼 的帖子

你没测试的吧.^_^
作者: terse    时间: 2009-9-24 14:13

对于 忽略以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 编辑 ]
作者: 523066680    时间: 2009-9-24 15:26     标题: 我做连续空格的

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

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

独立的那个1 我可没碰。

[ 本帖最后由 523066680 于 2009-9-24 19:01 编辑 ]
作者: 523066680    时间: 2009-9-24 15:29

  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 编辑 ]
作者: 523066680    时间: 2009-9-24 18:48

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


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

[ 本帖最后由 523066680 于 2009-9-24 18:49 编辑 ]
作者: netbenton    时间: 2009-9-24 19:42

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

  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
复制代码

作者: netbenton    时间: 2009-9-24 19:47

一、空格归一变量函数:
set "space_one=set @=!@: ="_" !&set @=!@: "_"=!&set @=!@:"_"=!"

用法:
(%space_one=变量名%)




二、空格归一并丢掉首尾空格变量函数:
set "space_one_cut=set @= !@: ="_" !"_"&set @=!@: "_"=!&set @=!@:"_"=!&set @=!@:~1!"

用法:
(%space_one_cut:@=变量名%)

[ 本帖最后由 netbenton 于 2009-9-24 20:17 编辑 ]
作者: 随风    时间: 2009-9-24 20:37

思路妙极了
作者: 随风    时间: 2009-9-24 20:51     标题: 回复 11楼 的帖子

忽略以abc或123或456开头的行 就是直接删除
作者: 523066680    时间: 2009-9-24 21:02

哇 积分真的没我的份……
我去我博儿独自玩了
作者: 523066680    时间: 2009-9-24 21:17

o~ 有for可以处理了耶,所以没我份了。我去吃自己了。
作者: caruko    时间: 2010-4-16 11:56

多个空行变1行的话,可以
more /s a.txt >_a.txt
作者: yashuer    时间: 2012-11-16 15:44

感觉这里的人喜欢用批处理做文本解析。但是相对而言,批处理的强项不在这里。
做文本解析的。个人认为sed ,awk  ,m4 等更强大点。
有的应用可以去gnu32网站上下载 coreutils 等 unix 工具来完成的
作者: 522235677    时间: 2013-1-5 10:02

都是高手啊
作者: 1e3e    时间: 2014-1-22 14:51

已知:
a县项目汇总.txt内容如下:
weewewe  wwww   sdsdsdssd     eeeeee
eweweweewe dsdsd  wewewew  dsdsd

sdsdsdsdsd sdsdsd sdsdsdsd dsdsdsdsads
sdadadaerer dsadfafa ffasdfasdf da**sfasf


dadfasf sadfafasf a**fafasf   fafasfdsafsaf
**fasfsafsafd   fafasfasfsafsaf  fasfasfasfasf
**f胗   fafasfasfeweewf  fasfarrf

现在按照其空白顺序(如图所示)依次在行尾加上使其内容如下:
weewewe  wwww   sdsdsdssd     eeeeee 项目规划地1部分
eweweweewe dsdsd  wewewew  dsdsd 项目规划地1部分

sdsdsdsdsd sdsdsd sdsdsdsd dsdsdsdsads 项目规划地2部分
sdadadaerer dsadfafa ffasdfasdf da**sfasf 项目规划地2部分


dadfasf sadfafasf a**fafasf   fafasfdsafsaf 项目规划地3部分
**fasfsafsafd   fafasfasfsafsaf  fasfasfasfasf 项目规划地3部分
**f胗   fafasfasfeweewf  fasfarrf 项目规划地3部分

说明:地1部分我没有打成“第1部分”,是因为处理文本的需要选择了“地”而非“第”




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