找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 95926|回复: 64

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

[复制链接]
发表于 2024-7-17 20:35:00 | 显示全部楼层 |阅读模式
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
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2024-7-17 21:10:17 | 显示全部楼层
绝对对齐是做不到的。你把例子b.txt的内容复制到txt看看就明白了。
要绝对,那就导出为csv表格形式吧。那是绝对整齐
 楼主| 发表于 2024-7-18 07:41:06 | 显示全部楼层
回复 2# ppll2030


    多谢,实在不行了就换其它方法了。
发表于 2024-7-18 08:56:07 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2024-7-18 09:27:22 | 显示全部楼层
回复 4# qixiaobin0715

谢谢,还是没有达到预期效果,a.txt中 最左侧的 aa   bbbbb   长度是随机和不是固定的长度。
发表于 2024-7-18 09:32:31 | 显示全部楼层
回复 5# shenlong
没搞明白你所谓的“预期效果”是指什么?
发表于 2024-7-18 09:39:03 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2024-7-18 10:04:19 | 显示全部楼层
只能这样勉为其难了:
  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技术 +1 收起 理由
shenlong + 1 热心帮助

查看全部评分

发表于 2024-7-18 11:13:38 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
shenlong + 1 完美解决问题

查看全部评分

 楼主| 发表于 2024-7-18 11:19:32 | 显示全部楼层
回复 8# qixiaobin0715


    多谢,效果可以,就用这个了。
 楼主| 发表于 2024-7-18 11:21:16 | 显示全部楼层
回复 7# aloha20200628


    多谢帮助。
发表于 2024-7-18 11:22:16 | 显示全部楼层
字节不同 要对齐  似乎只能改用制表符
  1. awk  -v OFS="\t"  '{print $1,$2,$3}' a.txt
复制代码
发表于 2024-7-18 11:23:53 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2024-7-18 11:45:46 | 显示全部楼层
本帖最后由 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 米
 楼主| 发表于 2024-7-18 14:30:07 | 显示全部楼层
回复 14# aloha20200628


    万分感谢,达到预期效果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:09 , Processed in 0.019692 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表