Board logo

标题: [文本处理] [已解决]给每行加上标点并使其对齐的批处理 [打印本页]

作者: rustnail    时间: 2009-8-9 00:56     标题: [已解决]给每行加上标点并使其对齐的批处理

如有下面不同长度的文字,要给每行结尾都加上逗号,且逗号对齐,如何写bat.谢谢!

输入:
asdgasdgd
asdfasdgsdgag
asdgsg

输出:
asdgasdgd       ,
asdfasdgsdgag,
asdgsg             ,

[ 本帖最后由 rustnail 于 2009-8-9 14:29 编辑 ]
作者: batman    时间: 2009-8-9 01:15

如果知道最长字符数,如:最长字符为20个就很好处理:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1,1,20) do set "k=!k! "
  3. for /f "delims=" %%a in (a.txt) do (
  4.     set "str=%%a%k%"
  5.     echo !str:~,20!,>>new.txt
  6. )
  7. start new.txt
复制代码

作者: rustnail    时间: 2009-8-9 01:28

谢谢!

希望逗号能够紧跟在最长的一列后面,而不是固定在某一列。呵呵
作者: rustnail    时间: 2009-8-9 01:31

呵呵,感谢提供了很好的思路,现在只要取出最长的列号就可以了
作者: batman    时间: 2009-8-9 01:45

如果不知道最长字符数,就要先获取最长字符数,这就麻烦点了:
  1. @echo off&setlocal enabledelayedexpansion
  2. echo a>>a.txt&set /a max=0
  3. for /f "delims=:" %%a in ('findstr /o .* a.txt') do (
  4.      set /a b=a,a=%%a,c=a-b-2
  5.      if !max! leq !c! set /a max=c
  6. )
  7. for /l %%a in (1,1,%max%) do set "k=!k! "
  8. for /f "delims=" %%a in (a.txt) do (
  9.     set "str=%%a%k%"
  10.     echo !str:~,%max%!,>>new.txt
  11. )
  12. start new.txt
复制代码

作者: batman    时间: 2009-8-9 01:51

还可以不要改动原文件,但代码就难懂点了:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a max=0
  3. for /f "delims=:" %%a in ('^(type a.txt^&echo a^)^|findstr /o .*') do (
  4.      set /a b=a,a=%%a,c=a-b-2
  5.      if !max! leq !c! set /a max=c
  6. )
  7. for /l %%a in (1,1,%max%) do set "k=!k! "
  8. for /f "delims=" %%a in (a.txt) do (
  9.     set "str=%%a%k%"
  10.     echo !str:~,%max%!,>>new.txt
  11. )
  12. start new.txt
复制代码

作者: rustnail    时间: 2009-8-9 01:52

找max column number的另外一种方法
awk "length>max{max=length}END{print max}" a.txt
作者: rustnail    时间: 2009-8-9 01:52

呵呵,已经不是批处理了
作者: batman    时间: 2009-8-9 02:16

问题得到解决后,请楼主主动在标题上加注[已解决]字样,谢谢。
作者: rustnail    时间: 2009-8-9 03:46

原帖由 batman 于 2009-8-9 01:15 发表
如果知道最长字符数,如:最长字符为20个就很好处理:@echo off&setlocal enabledelayedexpansion
for /l %%a in (1,1,20) do set "k=!k! "
for /f "delims=" %%a in (a.txt) do (
    set "str=%%a%k%"
    ech ...


还是有点问题:为什么会有!k!?

iojoj!k!  ,
llgajslg!k,
lasjdglasj,
ljgas!k!  ,
gsdfh!k!  ,
lasdhglsjg,
fasdgtt!k!,
fjdfj!k!  ,
qawq!k!   ,
sdfghsdh!k,
segsegs!k!,
gdfgd!k!  ,
dhgd!k!   ,
作者: rustnail    时间: 2009-8-9 04:00

双击执行没有问题,但是cmd执行就不行了
作者: terse    时间: 2009-8-9 12:38

修改下 batman兄 6楼代码
用最大行字数减当前行字数 处理怎么样
另type 改为 more 省了最后行问题
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims=:" %%i in ('"(more "a.txt"&echo;)|findstr /o .*"') do (
  3.    set /a n=%%i-2-m,m=%%i
  4.    if !n! gtr !c! set c=!n!
  5.    if defined var set _!l!=!var!&set l!l!=!n!
  6.    if not "%%j"=="" (set "var=%%j"&set/a l+=1)else set "var="
  7. )
  8. for /l %%a in (1,1,%c%) do set "k=!k! "
  9. (for /l %%a in (1,1,%l%) do (
  10.     set /a m=c-l%%a
  11.     if "!_%%a!" neq "" for %%b in (!m!) do echo !_%%a!!k:~,%%b!,
  12. ))>new.txt
  13. start new.txt
复制代码

[ 本帖最后由 terse 于 2009-8-9 12:53 编辑 ]
作者: rustnail    时间: 2009-8-9 14:29

谢谢大家!谢谢大家!




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2