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

[文本处理] 【练习-049】批处理按要求对齐整理文本内容

&&有文本a.txt内容如下:
  1. 3、接下来,你试着回答我一个问题批处理中最常用最复杂也是最强大的命令是哪个命令?
  2.     相信经过以上两次的训练,你会脱口而出“for”。是的,for命令的确是批处理中最重要的命令,学好它的意义是不容置疑的。管理员就此命令特为大家精心撰写了for命令从入门到精通一贴,你所要做的就是前前后后将此贴通遍,将其搞懂弄明白,并结合大量的for命令练习,以熟练掌握for命令的各种应用。
  3.                     至此,我可以说你已经脱菜了。但是不是掌握了for命令就可以“天下无敌,无坚不摧了呢”?非也,接下来,你还要继续提升自己。
复制代码
  要求通过批处理将其按60个左右的字节(一个英文字符占1字节,一个汉字字符占2字节)一行进行重整理(如遇分段可以不足60),同时对于空行要按原样输出,并且在每段(出现空行才视为分段)的开头空出两个汉字空格以对齐,生成的文本如下:
  1.   
  2.   3、接下来,你试着回答我一个问题批处理中最常用最复杂也是最
  3. 强大的命令是哪个命令?
  4.   相信经过以上两次的训练,你会脱口而出“for”。是的,for命令的
  5. 确是批处理中最重要的命令,学好它的意义是不容置疑的。管理员就此
  6. 命令特为大家精心撰写了for命令从入门到精通一贴,你所要做的就是
  7. 前前后后将此贴通遍,将其搞懂弄明白,并结合大量的for命令练习,以
  8. 熟练掌握for命令的各种应用。
  9.   至此,我可以说你已经脱菜了。但是不是掌握了for命令就可以“
  10. 天下无敌,无坚不摧了呢”?非也,接下来,你还要继续提升自己。
复制代码
  本题满分15分,先不考虑特殊字符但请注意代码通用性,视情况加分。

[ 本帖最后由 batman 于 2009-8-18 21:02 编辑 ]
1

评分人数

***共同提高***

60个左右的字节


左右哦~   是你说的哦

我等到了下午,没想到还是没人回帖。来捧场了

我不是认真的,是为了找回以前认识你时的味道。玩偏方~

  1. @echo off&setlocal enabledelayedexpansion
  2. mode con cols=62 lines=25
  3. for /f "tokens=*" %%a in (text.txt) do (
  4.    set now=%%a
  5.    if "!now:~0,3!"=="   " (set "now=!now: =!")
  6.    set "now=  !now!"
  7.    echo,!now!
  8.    echo,
  9. )
  10. pause
复制代码

[ 本帖最后由 523066680 于 2009-8-10 18:00 编辑 ]

TOP

呵呵,这次偏方玩得有点不对哦,请注意“生成文本如下”几个字。
***共同提高***

TOP

命令框应该和鼠标结合的嘛~      输出后用鼠标复制。

额,要用生成的方法啊?淡定,淡定。。。。。。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%a in (a.txt) do call :loop %%a
  3. pause>nul&goto :eof
  4. :loop
  5. set "s=    %1"&set i=34
  6. :again
  7. call set n=%%s:~0,!i!%%&echo !n!>>b.txt&call set m=%%s:!n!=%%
  8. set x=!m:~30,1!&(if not "!x!"=="" (set i=30&set s=!m!&goto again) else echo !m!>>b.txt)
  9. echo.>>b.txt
  10. goto :eof
复制代码
不知道这样符不符合题意……
1

评分人数

    • batman: 为积极参与加分PB + 2
Still with wax

TOP

哎,始终是效率问题,特殊字符也麻烦
  1. @echo off&setlocal enabledelayedexpansion
  2. ::下面设置每行显示的字节数
  3. set/a num=60
  4. set/a s=num/2-1
  5. for /l %%i in (1,1,%num%) do set "sign=!sign!."
  6. for /f "delims=" %%a in ('findstr/n ".*" a.txt') do (
  7. set "str=%%a"&set "str=!str:*:=!"
  8. if defined str for /f "tokens=* delims= " %%b in ("!str!") do set "str=  %%b"
  9. if defined str (set/a n=%s%&call :check) else echo/
  10. )
  11. pause>nul&exit
  12. :check
  13. if not defined str goto :eof
  14. set/a n+=1,m=n+1
  15. set var=!str:~,%n%!
  16. echo/%var%|findstr "%sign%" >nul 2>nul&&(
  17. set str=!str:~%n%!&echo/%var%&set/a n=%s%&goto check)||(
  18. if "!var!" equ "!str:~,%m%!" (echo/%var%&goto :eof) else goto check
  19. )
复制代码
1

评分人数

    • batman: 考虑问题欠全面PB + 8

TOP

呵呵,从5楼的代码编写的思路就可以看出有以下几点不足:
   1、for默认是忽略空行的,代码首先就没有考虑到空行的输出;
   2、代码也没有对分段点和英文字符及中文字符进行判断;
   3、代码没有对每段的行首原有的空格进行有效处理;
   4、最后一个goto :eof是多余的;
   5、代码书写不规范。
   最后,希望兄弟继续努力,你的批处理水平将会越来越高的。

[ 本帖最后由 batman 于 2009-8-11 00:29 编辑 ]
***共同提高***

TOP

回复 7楼 的帖子

回复batman兄,你可能没有测试代码,你说得情况都判断了的,只是代码效率不高
这是算法的问题了
至于书写贴上来是不规范了,我在计算机上看还可以。对于代码的缩进我目前也只是看着大家的代码凭感觉,没这方面的知识。

TOP

我7楼的贴子是说的5楼的,已修改。。。
***共同提高***

TOP

回复 9楼 的帖子

呵呵,回过头一看,我估计是batman兄在编辑帖子时我刚好发了贴。所以楼数不对了。(*^__^*)

TOP

回复 6楼 的帖子

赞扬的话就不说了,下面提出本人的建议:
1、for /f "delims=" %%a in ('findstr/n ".*" a.txt')是否改为for /f "tokens=1* delims=:" %%a in ('findstr/n ".*" a.txt'),
而后面直接set "str=%%b"更为好一点?
2、for /f "tokens=* delims= " %%b in ("!str!") 此处欠妥,因为在行首有英文空格、汉字空格和tab三种情况,兄
弟只考虑了一种情况是不够的,同时如在文本正文中也有这三种字符呢?
3、用echo|findstr判断效率不如if判断。
4、书写确实存在一定的问题,代码可读性要加强。

[ 本帖最后由 batman 于 2009-8-11 00:46 编辑 ]
***共同提高***

TOP

回复 11楼 的帖子

多谢batman兄的指点
第一个问题确实那样要好点。第二个问题没考虑到那么多,看到你范文前面是全角空格就当成全角空格了,考虑你说的情况加入delims分隔符集就可以了,论坛会把TAB变空格,我6楼就不改了。
问题三是关键,也是核心算法的问题,echo|findstr 这种方式实属无奈之举,我实在没有想到其他方法了,除开用临时文件的方法我暂时没想到怎么用if去判断。
期待大家完善的代码。。。

TOP

回复 7楼 的帖子

不是说60字节左右,我就没对英文字符判断了,不过空行问题确实没有解决。至于行首的空格,我复制你的文本,在我机器上运行效果很好啊,最大的一个问题就是没有处理空行。还有我发觉复制的时候空行里都有一个空格,可是复制到文本中后那个空格就消失了,不知道怎么回事。
Still with wax

TOP

回复 13楼 的帖子

可能是本人在顶楼给出的文本有问题,这里再传上一份文本(此文本内容里就有三种空格,行首的需要处理,但行内的是要求原样输出的)同时附上本人的代码(注请将第一个tab字符替换成tab再运行):
  1. @echo off&setlocal enabledelayedexpansion
  2. set "k1= "&set "k2= "&set "k3=tab"
  3. for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
  4.      set "str=%%b"
  5.      if defined str (
  6.         call :lp
  7.         ) else (
  8.         echo.&echo.&set "fd=a"
  9.      )
  10. )
  11. pause>nul&goto :eof
  12. :lp
  13. for %%a in ("%k1%" "%k2%" "%k3%") do if "!str:~,1!" equ %%a set "str=!str:~1!"&goto lp
  14. if defined fd set "str=  !str!"&set "fd="&set /a n=4
  15. :loop
  16. set /p=!str:~,1!<nul&set /a n+=1
  17. if "!str:~,1!" gtr "Z" set /a n+=1
  18. if %n% geq 60 set /a n=0&echo.
  19. set "str=!str:~1!"
  20. if defined str goto loop
复制代码
[attach]1733[/attach]
***共同提高***

TOP

回复 14楼 的帖子

逐字显示是我一开始就放弃的想法,没想到速度比我的快(经测试硬是比我的快了10多毫秒,长文本就更明显了)。看来echo|findstr的方法是太不好了。

TOP

返回列表