[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
绝对对齐是做不到的。你把例子b.txt的内容复制到txt看看就明白了。
要绝对,那就导出为csv表格形式吧。那是绝对整齐

TOP

回复 17# qixiaobin0715


    请问大佬,有没有办法输出到txt还能保持队形的。
上面的大佬们都是cmd下输出结果。
计算最大字符串并补齐空格,这个我也搞出来了。
就是不能输出到txt还保持不变形。

TOP

回复 19# qixiaobin0715


    感谢指导。看来是字体问题了。
换了自带记事本,依然混乱。

TOP

回复 20# buyiyang


    感谢解惑。更换字体后txt文件得到对齐的结果了。

TOP

我也发一个吧。也是用字节数补齐空格的方式。
就是代码啰嗦了一些。而且局限列数为5列。
不知道还能不能精简,望各位老大指点一二。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. rem 计算字符的字节,cmd下输出是对齐状态,导出txt会变形,需改换等宽字体,cmd默认是Consolas。
  4. REM 获取文本最大字符串的字节
  5. for /f "delims=" %%a in (1.txt) do for %%s in (%%a) do (
  6. set/p="%%s"<nul>$
  7. for %%b in ($) do if %%~zb gtr !maxZ! set "maxZ=%%~zb"
  8. )
  9. for /f "tokens=1-4*  delims= " %%a in (1.txt) do (
  10.     rem 获取每列字符串的字节
  11.     set "a=%%a"&set "b=%%b"&set "c=%%c"&set "d=%%d"&set "e=%%e"
  12.     set/p="%%a"<nul>$&for %%i in ($) do (set az=%%~zi)
  13.     set/p="%%b"<nul>$&for %%i in ($) do (set bz=%%~zi)
  14.     set/p="%%c"<nul>$&for %%i in ($) do (set cz=%%~zi)
  15.     set/p="%%d"<nul>$&for %%i in ($) do (set dz=%%~zi)
  16.     set/p="%%e"<nul>$&for %%i in ($) do (set ez=%%~zi)
  17.     rem 获取每列字符串的字节差,并用空格补齐
  18.     set/a Na=!maxZ!-!az!&set/a Nb=!maxZ!-!bz!&set/a Nc=!maxZ!-!cz!&set/a Nd=!maxZ!-!dz!&set/a Ne=!maxZ!-!ez!
  19.     for /l %%i in (1,1,!Na!) do set "a=!a! "
  20.     for /l %%i in (1,1,!Nb!) do set "b=!b! "
  21.     for /l %%i in (1,1,!Nc!) do set "c=!c! "
  22.     for /l %%i in (1,1,!Nd!) do set  "d=!d! "
  23.     rem for /l %%i in (1,1,!Ne!) do set  "e=!e! "
  24.     echo !a! !b! !c! !d! !e!
  25. )
  26. del/q $&pause&exit
复制代码

TOP

本帖最后由 ppll2030 于 2024-7-20 23:37 编辑

回复 31# buyiyang


    厉害了。大佬这个应该是完美通用版了。

TOP

回复 38# aloha20200628


    还是老大厉害啊。完美解决列数问题,还有全角空格等字符的问题。代码依旧如此简单明了。

TOP

回复 38# aloha20200628


    老大,发现一个bug:
如果某组字符中带有*号,这组字符就会被整体抹掉。
而带有英文"!"感叹号的,只会是感叹号抹掉,不会影响这组字符的其他字符。
貌似你的代码第7行中分别提取每行中每组字符的时候,带*号的这组就会被抹掉。
我自己用tokens来提取不会有这个问题,但是我的代码太繁琐,也有列数限制。
所以还是倾向于你的代码,请问可有解决办法?

TOP

回复 51# 77七
回复 48# qixiaobin0715

感谢两位大佬的指点。原因是已经找到了。只是想知道有没有什么好的经验或是取巧的办法可以避免这些通配符。
毕竟还想保持这么精简而干练的代码

TOP

回复 50# aloha20200628


    厉害了。换一个思路就搞定了特殊符号问题。这思维真是服了。

不过又有一个新问题: 对于包含有空格或制表符的空行(整行都不显示字符的,看着就像一空行),脚本会卡住,无法进行下去。

不过这不是很大的问题。我目前是加一段去除所有空行的命令,再继续执行就完美了。

再次感谢老大,通过这几段,学习到了很多。

TOP

回复 55# 77七


    哈哈。果然有取巧的办法。感谢指导

不过这个用在这里会引发另一个bug

当每行开头是几个空格开始的情况,取值第一个会是ECHO

TOP

回复 56# qixiaobin0715


    你的代码有些还看不明,需要研究一下
不过31楼的大佬,貌似也是按列来取值,然后根据每列最大字符串得到每列最大宽度。从而使得结果排版更加的完美。
而它第一段可以自动识别最大的列数。不需要手动填写,或许可以借鉴到你的代码里。
他的代码后半段很复杂。我一时半会不能理解透。
等研究透aloha的版本,再去研究31楼的。毕竟aloha的版本感觉思路跟我的有相似之处,好理解一些。

TOP

回复 58# aloha20200628


    老大。你的delims那边的有点问题,害我找了好久。
就是那个中英文空格你给打了三个。直接卡当了。修改为一个制表符和一个空格就OK了
像我这边,还加入全角符的空格,也完美支持了。标点符号也完美显示。
大赞哦~!

TOP

返回列表