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

[文本处理] [已解决]空格补位,把输出内容对齐的批处理

a.txt 内容
aa  1232   米
bbbbb  66  米
想要把内容补空格后输出到 b.txt
aa          1232    米
bbbbb     66       米
以下我测试的代码,不能达到预期效果,请各位围观帮忙,先行谢过
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "k=                    "
  4. (for /f "tokens=1-4  delims=  " %%a in (a.txt) do (
  5.     set "n1=%%a" && set "n2=%%b" && set "n3=%%c" && set "n4=%%d"
  6.     set a=!n1!%k% && set b=!n2!%k%  && set  c=!n3!%k%  && set  d=!n4!%k%
  7.     echo.  !a:~0,15! !b:~0,15! !c:~0,15! !d:~0,15!
  8. )) > b.txt
  9. endlocal
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

绝对对齐是做不到的。你把例子b.txt的内容复制到txt看看就明白了。
要绝对,那就导出为csv表格形式吧。那是绝对整齐

TOP

回复 2# ppll2030


    多谢,实在不行了就换其它方法了。

TOP

本帖最后由 qixiaobin0715 于 2024-7-18 09:01 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1-2*" %%i in (a.txt) do (
  4.     set f1=%%i                    
  5.     set f2=%%j                    
  6.     echo,!f1:~,20!!f2:~,20!%%k
  7. )
  8. pause
复制代码

TOP

回复 4# qixiaobin0715

谢谢,还是没有达到预期效果,a.txt中 最左侧的 aa   bbbbb   长度是随机和不是固定的长度。

TOP

回复 5# shenlong
没搞明白你所谓的“预期效果”是指什么?

TOP

本帖最后由 aloha20200628 于 2024-7-18 10:06 编辑

回复 1# shenlong

文本行的格式化输出,须确定最大列宽即最大字段长度。简单处理是由楼主预设一个最大列宽值,否则就要实时遍历整个文本文件获取其中最大字段长度...
给一个批处版本,代码如下》获取文本文件中的最大字段长度,假设字段分隔符是批处默认的空格、逗号、分号、等号和制表符。
  1. @echo off &setlocal enabledelayedexpansion &set "maxZ=0"
  2. for /f "delims=" %%a in (1.txt) do for %%s in (%%a) do (
  3. set/p="%%s"<nul>0.0
  4. for %%b in (0.0) do if %%~zb gtr !maxZ! set "maxZ=%%~zb"
  5. )
  6. echo,!maxZ!
  7. del/q "0.0"&endlocal&pause&exit/b
复制代码

TOP

只能这样勉为其难了:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. type a.txt>temp
  4. echo,a>>temp
  5. set /a n=0,y=0
  6. for /f "delims=:" %%i in ('findstr /o .* temp') do (
  7.     set /a x=%%i-y
  8.     if !n! lss !x! set /a n=x
  9.     set y=%%i
  10. )
  11. del temp
  12. for /l %%i in (1,1,!n!) do set BS= !BS!
  13. for /f "tokens=1-2*" %%i in (a.txt) do (
  14.     set f1=%%i!BS!
  15.     set f2=%%j!BS!
  16.     echo,!f1:~,%n%!!f2:~,%n%!%%k
  17. )
  18. pause
复制代码
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-7-18 12:08 编辑

回复 1# shenlong
  1. @echo off &setlocal enabledelayedexpansion &set "maxZ=0"
  2. for /f "delims=" %%a in (1.txt) do for %%s in (%%a) do (
  3. set "s=%%s" & (call :_strLen s z)
  4. if !z! gtr !maxZ! set "maxZ=!z!"
  5. )
  6. set "ms=" &for /l %%n in (1,1,!maxZ!) do set "ms=!ms! "
  7. endlocal &set "maxZ=%maxZ%"&set "ms=%ms%"
  8. setlocal enabledelayedexpansion
  9. for /f "delims=" %%a in (1.txt) do (
  10. set "s="
  11. for %%s in (%%a) do (set "_s=%%s"&set "_s=!_s!%ms%"&set "s=!s! !_s:~0,%maxZ%!")
  12. echo,!s:~1!
  13. )
  14. endlocal&pause&exit/b
  15. :_strLen
  16.    set "_str=_!%~1!" &set "_Len=0"
  17.    for %%n in (64 32 16 8 4 2 1) do (
  18.       if "!_str:~%%n,1!" neq "" (set/a "_Len+=%%n"&set "_str=!_str:~%%n!")
  19.    )
  20.    set "%~2=!_Len!" &exit/b
复制代码

特此备注》重写了原代码,改用批处 ‘原装’ 的字符串长度计算方法,再请出制表符 ‘显灵’,似乎消除了以前格式化输出时中英文字符混合字段的占位问题...
1

评分人数

TOP

回复 8# qixiaobin0715


    多谢,效果可以,就用这个了。

TOP

回复 7# aloha20200628


    多谢帮助。

TOP

字节不同 要对齐  似乎只能改用制表符
  1. awk  -v OFS="\t"  '{print $1,$2,$3}' a.txt
复制代码

TOP

本帖最后由 qixiaobin0715 于 2024-7-18 12:54 编辑

这样可能要美观一些:
  1. @echo off
  2. for /f "tokens=1-3" %%i in (a.txt) do (
  3.     echo,%%i>>temp1
  4.     echo,%%j>>temp2
  5. )
  6. set /a n1=n2=0,y1=y2=0
  7. setlocal enabledelayedexpansion
  8. for %%a in (1 2) do (
  9.     echo,a>>temp%%a
  10.     for /f "delims=:" %%i in ('findstr /o .* temp%%a') do (
  11.         set /a x%%a=%%i-y%%a
  12.         if !n%%a! lss !x%%a! set /a n%%a=x%%a
  13.         set y%%a=%%i
  14.     )
  15.     del temp%%a
  16.     set /a n%%a+=4
  17. for /l %%i in (1,1,!n%%a!) do set BS%%a= !BS%%a!
  18. )
  19. (for /f "tokens=1-2*" %%i in (a.txt) do (
  20.     if "%%j"=="" (set f1=%%i) else (set f1=%%i!BS1!&set f1=!f1:~,%n1%!)
  21.     if "%%k"=="" (set f2=%%j) else (set f2=%%j!BS2!&set f2=!f2:~,%n2%!)
  22.     set f3=%%k
  23.     echo,!f1!!f2!!f3!
  24. ))>b.txt
  25. pause
复制代码
1

评分人数

TOP

本帖最后由 aloha20200628 于 2024-7-18 12:25 编辑

回复 11# shenlong

参考12楼的经验,谢谢 重写了9楼代码,用以下1.txt示例文件测试效果明显 楼主可试试...
1.txt》
aa  自x车 1232   米
mm命名  abc 5555  米
bbbbb  密码可靠 66  米
同轴3xx   国产321   456 米

TOP

回复 14# aloha20200628


    万分感谢,达到预期效果。

TOP

返回列表