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

【练习-003】批处理实现文本左右对齐排版

如1.txt内容如下。
  1. 111111111111111111111    98912 张三
  2. 222222222222222222    150020 李四四
  3.   333333333333333333333    360000 王五
  4. 444444444444444444    2332 赵六六
  5.   555555555555555555    222 田七
  6. 666666666666666666666    999999 舞吧
复制代码
通过批处理输出为:
  1. 111111111111111111111      98912 张三
  2. 222222222222222222        150020 李四四
  3. 333333333333333333333     360000 王五
  4. 444444444444444444          2332 赵六六
  5. 555555555555555555           222 田七
  6. 666666666666666666666     999999 舞吧
复制代码
代码要求,不生成任何临时文件。
代码简洁,视思路与代码加分!
------------------------------------------------------------------------------------------
本题只是给出一个简单的文本通过批处理排版,而要求代码的通用,正如batman版主所说,会是一个繁琐的过程,于是就题解题,不必考虑代码的通用。

[ 本帖最后由 batman 于 2008-7-27 23:57 编辑 ]
心绪平和,眼藏静谧。

根据3楼思路改写,实现列与列之间空格最少:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. for /f "tokens=1,2" %%i in (1.txt) do (
  5.     set "var=%%i%%j"
  6.     set m=0
  7.     call :1
  8. )
  9. for /l %%x in (1,1,!n!) do set KG= !KG!
  10. set /a n+=1
  11. for /f "tokens=1-3" %%a in (1.txt) do (
  12.     set str=%%a%%b%KG%
  13.     for %%y in (!n!) do set str=!str:~0,%%y!
  14.     set str=!str:%%b=!%%b %%c
  15.     echo !str!
  16. )
  17. pause
  18. goto :eof
  19. :1
  20. if not "!var:~%m%,1!"=="" set /a m+=1&goto 1
  21. if %m% gtr %n% set n=%m%
  22. goto :eof
复制代码

TOP

就题解题,前2列字符目视不超过30个字符,KG30的值取30个空格:
  1. @echo off
  2. set KG30=                              
  3. setlocal enabledelayedexpansion
  4. for /f "tokens=1-3" %%a in (1.txt) do (
  5. set str=%%a%%b%KG30%
  6. set str=!str:~0,30!
  7. set str=!str:%%b=!%%b %%c
  8. echo !str!
  9. )
  10. pause
复制代码

TOP

回复 1# pusofalse
  1. ::文本两端对齐
  2. @echo off & setlocal enabledelayedexpansion
  3. cd /d %~dp0
  4. ::将空格替换成#号,再在基础上进行切割,结合tab水平制作符。
  5. for /f "delims=" %%i in (1.txt) do (
  6. set "str=%%i"
  7. set "str=!str: =#!"
  8. rem echo;!str!
  9. for /f "tokens=1-3 delims=#" %%a in ("!str!") do echo;%%a %%b %%c
  10. )
  11. pause
复制代码
我就是我,不一样的烟火!

TOP

回复 12# batman


    版主,您好,看了您的代码很实用,但是如果有一种情况就是第二列有空的,怎么处理呢?
例如原文本:
111111111111111111111    98912 张三
222222222222222222    150020 李四四
  333333333333333333333    360000 王五
444444444444444444         赵六六
  555555555555555555        田七
666666666666666666666    999999 舞吧

如果第二列为空的话,生成的第三列就跑到了第二列去了,请问下怎么解决呢?

TOP

本帖最后由 ShenMian 于 2018-1-20 22:52 编辑

格式printf 字符串1 空格数 字符串2 空格数 ... 空格数 字符串n
代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1,2,3" %%a in (1.txt) do (
  4.     call:printf %%a 20 %%b 20 %%c
  5.     echo;
  6. )
  7. exit /b
  8. :printf
  9. set /p "=%~1"<nul
  10. set length=0
  11. set "str=%~1"
  12. :printf_0
  13. if "!str:~%length%!" == "" (
  14. for /l %%a in (%length%,1,%2) do set /p = <nul
  15. shift
  16. shift
  17. if not "%~3" == "" goto printf
  18. exit /b
  19. )
  20. set /a length+=1
  21. goto printf_0
复制代码

TOP

  1. """
  2. #方法4 重用了方法3的上半部分代码算出列1列2最大长度,以此对齐顶点。
  3. #这个方法的思路是不使用空格或者其它符号填充,而是在写入文件时,
  4. #指针直接前移使字符对齐。空的字符位置会自动被\x00填充?
  5. #
  6. """
  7. def f4():
  8.    
  9.     f=open("1.txt","r")
  10.     txt=f.readlines()
  11.     maxa=0
  12.     maxb=0
  13.     for line in txt:
  14.         line=line.rsplit()
  15.         la=len(line[0])
  16.         lb=len(line[1])
  17.         if la >maxa:
  18.             maxa=la
  19.         if lb > maxb:
  20.             maxb=lb
  21.     w=open("temp.txt","w+")
  22.     for line in txt:
  23.         line=line.rsplit()
  24.         la=len(line[0])
  25.         lb=len(line[1])
  26.         w.write(line[0])
  27.         #算了半天
  28.         tw=maxa+maxb+1-la-lb
  29.         w.seek(tw+w.tell())
  30.         w.write(line[1])
  31.         w.seek(w.tell()+1)
  32.         w.write(line[2]+"\n")
  33.     w.flush()
  34.     w.seek(0)
  35.     txt=w.read()
  36.     print(txt)
  37.         
  38. """
  39. 输出:
  40. 111111111111111111111
复制代码
-_-!剪贴碰到00自动截断了。输出内容不能完全贴上来。

TOP

  1. # python版实现文本左右对齐排版
  2. # 题目来源: http://www.bathome.net/thread-1246-1-1.html
  3. # 依山居 7:17 2015/11/4
  4. # str.format 字符串格式化参考:
  5. # http://www.crifan.com/python_string_format_fill_with_chars_and_set_alignment/
  6. # just()字符串对齐 参考:
  7. # http://blog.csdn.net/u012515223/article/details/20463231
  8. '''
  9. 1.txt内容:
  10. 111111111111111111111    98912 张三
  11. 222222222222222222    150020 李四四
  12.   333333333333333333333    360000 王五
  13. 444444444444444444    2332 赵六六
  14.   555555555555555555    222 田七
  15. 666666666666666666666    999999 舞吧
  16. '''
  17. #说明我的代码没按题目要求全部使用空格填充是为了让代码用法看起来直观一些。
  18. #方法一 format格式化对齐
  19. def f1():   
  20.     with open("1.txt","r") as f:
  21.         for s in f:
  22.             l=s.rsplit ()
  23.             t='{0:-<25} {1: >7} {2}'.format(l[0],l[1],l[2])   
  24.             print(str(t))
  25. '''
  26. 输出:
  27. 111111111111111111111----   98912 张三
  28. 222222222222222222-------  150020 李四四
  29. 333333333333333333333----  360000 王五
  30. 444444444444444444-------    2332 赵六六
  31. 555555555555555555-------     222 田七
  32. 666666666666666666666----  999999 舞吧
  33. '''
  34. #方法2 使用just()对齐
  35. r=''
  36. def f2():
  37.     f=open("1.txt","r")
  38.     for s in f:
  39.         l=s.rsplit()
  40.         print(l[0].ljust(25," "),l[1].rjust(10,"^"),l[2])
  41. '''
  42. 输出:
  43. 111111111111111111111     ^^^^^98912 张三
  44. 222222222222222222        ^^^^150020 李四四
  45. 333333333333333333333     ^^^^360000 王五
  46. 444444444444444444        ^^^^^^2332 赵六六
  47. 555555555555555555        ^^^^^^^222 田七
  48. 666666666666666666666     ^^^^999999 舞吧
  49. '''
  50. #方法3
  51. '''
  52. 思路是rsplit拆分成三列,l得到如['111111111111111111111', '98912', '张三']
  53. 算出列1,列2的最长,以此算出需要填充的长度,
  54. '''
  55. def f3():
  56.     f=open("1.txt","r")
  57.     txt=f.readlines()
  58.     maxa=0
  59.     maxb=0
  60.     for line in txt:
  61.         line=line.rsplit()
  62.         la=len(line[0])
  63.         lb=len(line[1])
  64.         if la >maxa:
  65.             maxa=la
  66.         if lb > maxb:
  67.             maxb=lb
  68.     for line in txt:      
  69.         line=line.rsplit()
  70.         la=len(line[0])
  71.         lb=len(line[1])
  72.         if la ==maxa:
  73.             tla=line[0]
  74.         elif la<maxa:
  75.             tla=line[0]+">"*(maxa-la)
  76.         if lb ==maxb:
  77.             tlb=line[1]
  78.         elif lb<maxb:
  79.             tlb=" "*(maxb-lb)+line[1]
  80.         print(tla,tlb,line[2])
  81. '''
  82. 输出:
  83. 111111111111111111111  98912 张三
  84. 222222222222222222>>> 150020 李四四
  85. 333333333333333333333 360000 王五
  86. 444444444444444444>>>   2332 赵六六
  87. 555555555555555555>>>    222 田七
  88. 666666666666666666666 999999 舞吧
  89. '''
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2,3 delims= " %%a in (a.txt) do (
  3. set k=%%a
  4. set k1=%%b
  5.     for /l %%c in (1,1,25) do if "!k:~%%c,1!"=="" set "k=!k! "
  6.     for /l %%d in (1,1,5) do if "!k1:~%%d,1!"=="" set "k1=!k1! "
  7. echo;!k! !k1! %%c
  8. )
  9. pause
复制代码
心累~努力,为了美好的明天。

TOP

  1. @Echo Off
  2. SetLocal EnableDelayedExpansion
  3. For /F "Tokens=1,2,3" %%i In (1.txt) Do (
  4. Set L1=%%i                    
  5. Set L2=                    %%j
  6. Echo !L1:~0,25!!L2:~-15! %%k
  7. )
复制代码

TOP

  1. @echo off  
  2. setlocal EnableDelayedExpansion
  3. set "space= "
  4. for /f "tokens=1,2*" %%a in (1.txt) do (
  5.     set "str1=%%a"& set /a n=0
  6.     set /a s=1 &  call :1
  7.     set "x=!str1!!str2!" & set str2=
  8.     set "str1=%%b" & set /a n=0
  9.     set /a s=2 & call :1
  10.     set "y=!str2!!str1!" & set str2=
  11.     set "str1=%%c" & set /a n=0
  12.     set /a s=3 & call :1
  13.     set "z=!str2!!str1!" & set str2=
  14.     echo !x!!y!!z!
  15. )
  16. pause>nul
  17. goto :eof
  18. :1
  19. if not "!str1:~%n%,1!"=="" set /a n+=1 & goto :1
  20. if %s% equ 1 (set /a m=26-%n% & goto :2)
  21. if %s% equ 2 (set /a m=10-%n% & goto :2)
  22. set /a m=10
  23. :2
  24. for /l %%i in (1,1,!m!) do set "str2=!str2!%space%"
  25. goto :eof
复制代码
效果见下图:

TOP

下载了10楼附件,可是还是没效果啊,莫非win7不支持这样么...

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-3" %%a in (1.txt) do (
  3. set str=%%a%%b
  4. call:count
  5. set a=%%a
  6. set /a num=32-!num!
  7. set/p=!a!<nul
  8. for /l %%i in (1 1 !num!) do (set /p= <nul)
  9. echo %%b %%c
  10. )
  11. pause>nul
  12. :count
  13. if defined num set num=
  14. :loop
  15. if not "!str!"=="" (
  16. set str=!str:~1!
  17. set /a num+=1
  18. goto loop
  19. )
复制代码
only the strong survive!

TOP

新接触批处理,很有意思,请各位大侠多多指教。在此送上我的代码,多多指教!既然各位大侠都说了就题解题,那不好意思了,嘿嘿……

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-3" %%i in (test.txt) do (
  3. set temp1=%%i$$$$$&set temp2=$$$$$%%j&set temp3=%%k$$$$$
  4. set temp1=!temp1:~0,21!&set temp2=!temp2:~-6!&set temp3=!temp3:~0,3!
  5. set tempstr=!temp1!      !temp2! !temp3!
  6. set tempstr=!tempstr:$= !
  7. echo !tempstr!
  8. )
复制代码

[ 本帖最后由 weichenxiehou 于 2010-12-30 23:37 编辑 ]
看得多说得多,远比不上写得多。

TOP

不知此帖是否够通用?不过创建了临时文件。
http://bbs.bathome.net/viewthrea ... mp;highlight=%C5%C5
技术问题请到论坛发帖求助!

TOP

返回列表