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

【练习-008】批处理实现文本内容横列变纵列

因为论坛会吞掉文本每行的第一个空格,现截图上来。

每行的字符数都一样,但未知多少个字符。
注意,文本第三行r之后有一个空格。第四行x之后有一个空格。
输出为:

即横列变纵列,并保留原来空格。
要求,高效,不生成临时文件。
心绪平和,眼藏静谧。

  1. @echo off
  2. Setlocal EnableDelayedExpansion
  3. set maxlength=0
  4. for /f "delims=" %%i in (a.txt) do (
  5.     call :len "%%i" length
  6.     set "number=!number! !length!"
  7.     set "list=!list!%%i"
  8. )
  9. for /l %%i in (1,1,%maxlength%) do (
  10.     set /a x=0
  11.     set "temp="
  12.     for %%j in (%number%) do (
  13.         set /a m=!x!+%%i-1
  14.         call set temp=!temp!%%list:~!m!,1%%
  15.         set /a x+=%%j
  16.     )
  17.     echo !temp!
  18. )
  19. exit
  20. :len
  21. set "strs=%~1" & set /a n=0
  22. :loop
  23. if defined strs (
  24.     set strs=%strs:~1%
  25.     set /a n+=1
  26.     goto:loop
  27. )
  28. if %maxlength% lss %n% (
  29.     set maxlength=%n%
  30. )
  31. set %2=%n%
复制代码

TOP

  1. @echo off
  2. set /p char=<a.txt
  3. set n=0
  4. :o
  5. if not "%char%"=="" (
  6.     set /a n+=1
  7.     set char=%char:~1%
  8.     goto :o
  9. )
  10. set /a n-=1
  11. setlocal enabledelayedexpansion
  12. for /l %%b in (0,1,%n%) do (
  13.     for /f "delims=" %%a in (a.txt) do (
  14.         set "str=%%a"
  15.         set str%%b=!str%%b!!str:~%%b,1!
  16.     )
  17.     echo !str%%b!
  18. )
  19. pause
复制代码

TOP

贴一个正统的解法
用到了临时文件
得亏事先造好了声势
可以不用偷偷摸摸了

楼主号称5句代码能够解题
等待瞻仰中……
  1. @echo off & setlocal EnableDelayedExpansion
  2. rem 重置可能影响程序的环境变量为空
  3. for %%e in (lines context sizes cols) do set %%e=
  4. rem 将所有文本行拼成一行,并统计行数
  5. for /f "delims=" %%l in (a.txt) do set /a lines+=1&set "context=!context!%%l"
  6. rem 获取文本总字节数,并依此计算列数和列边界
  7. (echo %context%)>b.txt
  8. for %%f in (b.txt) do set /a sizes=%%~zf-2,cols=sizes/lines,collimit=cols-1
  9. rem 依照字符坐标转换,依次输出各列字符
  10. for /l %%i in (0,1,%collimit%) do (
  11. for /l %%j in (%%i,%cols%,%sizes%) do set/p=!context:~%%j,1!<nul
  12. echo.
  13. )
  14. pause
复制代码
天的白色影子

TOP

哈哈,这题么,全是单字节字符,正好用上cmd /u
  1. @echo off&setlocal enabledelayedexpansion
  2. find /v "" a.txt
  3. echo 以下为纵横转换结果:
  4. for /f "skip=1 delims=:" %%a in ('(type a.txt^&echo;^)^|findstr /o .*') do (
  5.         set /a ho=%%a-2,l=ho-last-2,last=ho,"max+=(max-l)*((max-l)>>31)"
  6.         set o=!o!!ho!
  7. )
  8. set n=1
  9. for /f "delims=" %%a in ('cmd /u /c type a.txt^|more') do (
  10.         for /f "tokens=1,2" %%x in ("!n! !o!") do (
  11.                 set .!n!=!.%%x!%%a
  12.                 set /a n+=1,m+=1
  13.                 if !m!==%%y (
  14.                         for /l %%z in (!n! 1 %max%) do set ".%%z=!.%%z! "
  15.                         set o=!o:* =!&set /a n=1,m+=2
  16.                 )
  17.         )
  18. )
  19. for /l %%a in (1 1 %max%) do echo [!.%%a!]
  20. pause
复制代码

[ 本帖最后由 zm900612 于 2011-3-13 12:31 编辑 ]

TOP

看错题意,算了...

[ 本帖最后由 zm900612 于 2011-3-12 13:01 编辑 ]

TOP

支持每行字符数不同
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (set/a n+=1&set "_!n!=%%a")
  3. :loop
  4. for /l %%i in (1,1,%n%) do (
  5.     if defined _%%i (<nul set/p=!_%%i:~,1!&set _%%i=!_%%i:~1!) else (set/p= <nul)
  6. )
  7. echo/&for /l %%i in (1,1,%n%) do if defined _%%i goto loop
  8. pause
复制代码

TOP

新人,来学习学习,支持楼主了,说实话看了就头大,吼吼

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (set v=%%i&call :lp)
  3. for /l %%i in (0 1 %n%) do (echo.!#%%i!)
  4. pause&goto :eof
  5. :lp
  6. for /l %%a in (0,1,100) do (if "!v:~%%a,1!"=="" (set n=%%a&goto :eof) else (set #%%a=!#%%a!!v:~%%a,1!))
复制代码

TOP

回复batman

不是说我不想帮助别人,只是不知道怎么样去帮助别人。

我觉得自己的技术还不够成熟,怕给别人说错了,误导别人,这个责任我担不起。
(*^_^*)

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.     set v=%%i
  4.     set n=0
  5.     call :lp
  6. )
  7. for /l %%i in (1 1 %n%) do (
  8.     set num=%%i
  9.     call,echo %%_!num!%%
  10. )
  11. pause&exit/b
  12. :lp
  13.     set /a n+=1
  14.     set _%n%=!_%n%!%v:~0,1%
  15.     set v=%v:~1%
  16.     if not "%v%"=="" goto lp
  17. goto :eof
复制代码
1

评分人数

    • batman: 自己提高的同时更应去乐心助人PB + 5
(*^_^*)

TOP

第一题

发错了!还是先向别人学习

[ 本帖最后由 sjzong 于 2009-4-24 18:38 编辑 ]

TOP

行的字符不同处理
  1. @echo off&setlocal enabledelayedexpansion
  2. set t=0
  3. for /f "delims=" %%i in (a.txt) do set str=%%i&set/a n+=1,m=1&call:lp
  4.    for /l %%i in (1 1 %t%) do (
  5.       for /l %%j in (1 1 %n%) do if "!%%jp%%i!"=="" (set/p= <nul)else set/p=!%%jp%%i!<nul
  6.       echo.
  7. )
  8. pause&goto :eof
  9. :lp
  10.    set "%n%p%m%=%str:~,1%"
  11.    set "str=%str:~1%"
  12.    if defined str set/a m+=1&goto lp
  13.    if %m% gtr %t% set/a t=m
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do set str=%%i&set/a n+=1,m=0&call:lp
  3.    for /l %%i in (0 1 %m%) do if not "!%%ip!"=="" echo !%%ip!
  4. pause&goto :eof
  5. :lp
  6.    set "%m%p=!%m%p!!str:~%m%,1!"
  7.    if not "!str:~%m%,1!"=="" set/a m+=1&goto lp
复制代码

TOP

这道题并不难啊,大家都来锻炼下思维,踊跃答题啊!
***共同提高***

TOP

返回列表