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

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

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

本帖最后由 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

回复 12# 娜美
只要计算出每列的最大字节数,以及各列字节数与最大字节数的差值,然后用空格补齐即可。
可能会稍微复杂些,抽空试试。
1

评分人数

TOP

本帖最后由 qixiaobin0715 于 2024-7-19 12:47 编辑

回复 18# ppll2030
输出的txt文件你用“记事本”打开看看。
不同的文本编辑器,字符不同占用宽度可能会有区别。

TOP

本帖最后由 qixiaobin0715 于 2024-7-19 14:54 编辑

按照各列字节数与最大字节数的差值,然后用空格补齐的方法,适用含有中文字符的列:
  1. @echo off
  2. set colsn=4
  3. set /a colsn-=1
  4. for /f "tokens=1-%colsn%" %%1 in (a.txt) do (
  5.     echo,%%1>>temp1
  6.     echo,%%2>>temp2
  7.     echo,%%3>>temp3
  8. )
  9. setlocal enabledelayedexpansion
  10. for /l %%a in (1,1,%colsn%) do (
  11.     echo,a>>temp%%a
  12.     set /a x=n%%a=0
  13.     for /f "tokens=1,2 delims=:" %%i in ('findstr /n /o .* temp%%a') do (
  14.         set /a "x%%a=%%j-x"
  15.         set /a "m=%%i-1"
  16.         set "n%%a#!m!=!x%%a!"
  17.         if !n%%a! lss !x%%a! set /a "n%%a=x%%a"
  18.         set "x=%%j"
  19.     )
  20.     del temp%%a
  21. )
  22. for /f "tokens=1-%colsn%*" %%1 in (a.txt) do (
  23.     set /a "n+=1"
  24.     set f=
  25.     set "f1=%%1"
  26.     set "f2=%%2"
  27.     set "f3=%%3"
  28.     for /l %%x in (1,1,%colsn%) do (
  29.         set /a "m%%x=n%%x-n%%x#!n!"
  30.         for /l %%y in (1,1,!m%%x!) do set "f%%x=!f%%x! "
  31.         set "f=!f!!f%%x!    "
  32.     )
  33.     echo,!f!%%4
  34. )
  35. pause
复制代码
由于未及仔细考虑,代码存在以下缺点:
1.代码过于复杂,可读性差;
2.除最后一列外,其余各行各列字节数均预先设置变量,处理较大文件时,速度可能会比较慢,甚至超出变量设置的上限而出错;
3.上面代码是按4列文本来处理的,如果列数有变化,需要对以上代码进行修改(虽然写代码时,考虑到了列数变化时,尽量减少修改量),通用性不是太好。

下面举例说明列数变化时,代码调整的方法:
1.如果文本内容的列数为3列,代码做如下调整:
第2行变量值修改为3;
删除第7行;
删除第27行;
将第33行的%%4改为%%3;
2.如果文本内容的列数为5列,代码做如下调整:
第2行变量值修改为5;
第7行下面增加一行:echo,%%4>>temp4
第27行下面增加一行:set "f4=%%4"
将第33行的%%4改为%%5;

TOP

回复 47# ppll2030
感叹号的问题是变量延迟造成的,你可以试试如果感叹号成对出现,感叹号以及一对感叹号之间的字符都会“隐藏”。*的问题没有遇见过,还是留给大佬们来解释吧。

TOP

回复 41# buyiyang
是的,相似的字符还有分号、跳格。

TOP

本帖最后由 qixiaobin0715 于 2024-7-22 17:02 编辑

自己又偷偷的写了一个代码,对for默认分隔符和通配符 *?以及延迟变量中的 ! 免疫,效率不行,没好意思发出来。

TOP

本帖最后由 qixiaobin0715 于 2024-7-24 09:40 编辑

回复 53# ppll2030
字符串分行显示时,不使用for %%a in (...) do...这样的循环结构,可以避免出现默认分隔符以及*?通配符的影响;
至于变量延迟中!会”隐藏“的问题有多种解决方法,其中一种方法可以参考http://www.bathome.net/thread-11193-1-1.html

TOP

本帖最后由 qixiaobin0715 于 2024-7-23 15:54 编辑

回复 59# ppll2030
1.排版美不美观个人看法不一,只要达到各列上下对齐的效果,调整列的宽度就是小kiss,增加或减少几个空格而已;
2.如果列数都懒得搞清楚,就太那个了吧。实际上要解决这个问题也不复杂,就是在原有代码外层加上goto循环,再if几下即可。个人感觉goto语句太过难看,很少使用此循环。

TOP

嵌套变量延迟开关, 来消除文本中“!”的影响,弃用for %%i in (...) do...的方法,通吃文本中存在默认分隔符以及*?通配符等字符的影响,使用大多数人熟悉的cmd命令书写代码。感觉效率还可以:
  1. @echo off
  2. echo,>$1
  3. :a
  4. set Em=
  5. set /a colsn+=1
  6. if %colsn% equ 1 (
  7.     (for /f "tokens=1" %%i in (a.txt) do (echo,%%i&set Em=1))>temp
  8. ) else (
  9.     (for /f "tokens=1,%colsn%" %%i in (a.txt) do (echo,%%j&if not "%%j"=="" set Em=1))>temp
  10. )
  11. if not defined Em goto :b
  12. echo,>>temp
  13. findstr /n /o .* temp>$2
  14. setlocal enabledelayedexpansion
  15.     for /f "tokens=1,2 delims=:" %%i in ($2) do (
  16.         set /a m=%%j-x
  17.         set /a n=%%i-1
  18.         set "a!n!=!m!"
  19.         if !max! lss !m! set "max=!m!"
  20.         set "x=%%j"
  21.     )
  22. set /a n+=1
  23.     (for /f "delims=:" %%i in ('findstr /n .* temp') do (
  24.         set str1=
  25.         set str2=
  26.         set /p str1=
  27.         set /a z=max-a%%i
  28.         for /l %%k in (1,1,!z!) do set str2=!str2!
  29.         if %%i neq !n! echo,!str1!!str2!
  30.     ))<temp>$2
  31.     (for /f "tokens=1* delims=:" %%i in ('findstr /n .* $2') do (
  32.         endlocal
  33.         set /p Line1=
  34.         set Line2=%%j
  35.         setlocal enabledelayedexpansion
  36.         if "!Line1!"=="" (echo,!Line2!) else echo,!Line1!    !Line2!
  37.     ))<$1>b.txt
  38. type b.txt>$1
  39. endlocal
  40. if defined Em goto :a
  41. :b
  42. del temp $1 $2
  43. pause
复制代码

TOP

返回列表