标题: 【练习-008】批处理实现文本内容横列变纵列 [打印本页]
作者: pusofalse 时间: 2008-8-2 06:38 标题: 【练习-008】批处理实现文本内容横列变纵列
因为论坛会吞掉文本每行的第一个空格,现截图上来。
每行的字符数都一样,但未知多少个字符。
注意,文本第三行r之后有一个空格。第四行x之后有一个空格。
输出为:
即横列变纵列,并保留原来空格。
要求,高效,不生成临时文件。
作者: ieutk 时间: 2008-8-2 08:15
- @echo off
- setlocal enabledelayedexpansion
- set /a num=-1
- :main
- set "ot="
- set /a num+=1
- for /f "delims=" %%a in (a.txt) do call :ie "%%a"
- echo.%ot%
- goto :main
-
-
- :ie
- set "var=%~1"
- if "!var:~%num%,1!"=="" (pause&exit)
- call,set "ot=!ot!%%var:~%num%,1%%"
- goto :eof
复制代码
作者: pusofalse 时间: 2008-8-2 08:54
我试了一下,这题能在5句之内解决。
作者: 浅默 时间: 2008-8-2 21:43
@echo off&setlocal enabledelayedexpansion
for /l %%a in (0,1,10) do (
for /f "delims=" %%i in (a.txt) do (
set ke=%%i
set /p=!ke:~%%a,1!<nul
)
echo.
)
pause
作者: pusofalse 时间: 2008-8-2 21:55
4楼的代码够简洁,但仍不通用。
每行的字符数是未知的。
作者: batman 时间: 2008-8-2 23:49
先贴一种方案吧:- @echo off&setlocal enabledelayedexpansion
- set "n=0"&set "m=0"
- :lp
- for /f "delims=" %%+ in (1.txt) do (
- set /a x+=1&set "str=%%+"
- if "!str:~%n%,1!" equ "" (
- set /a m+=1
- if !m! equ !x! pause>nul&goto :eof
- ) else (
- set /p=!str:~%n%,1!<nul
- )
- )
- echo.&set /a n+=1,x=0&goto lp
复制代码
作者: batman 时间: 2008-8-3 00:29
再来段貌似高深的代码:- @echo off
- for /f "delims=" %%. in (1.txt) do set "_=0"&set "..=%%."&call :{}
- for /l %%+ in (1,1,%_%) do call,echo.%%..%%+%%
- pause>nul&goto :eof
- :{}
- set "#=%..:~,1%"&call,set "..=%%..:~1%%"&set /a _+=1&call,set "..%_%=%%..%_%%%%#%"&if defined .. goto {}
复制代码
说明下:
之所以写下这么一段怪异的代码,就是想告诉大家,只要你运用得得当,批处理真的是可以随心所欲地写,这也就
是其中乐趣所在了。。。
[ 本帖最后由 batman 于 2008-8-3 00:50 编辑 ]
作者: batman 时间: 2008-8-3 13:31
这道题并不难啊,大家都来锻炼下思维,踊跃答题啊!
作者: terse 时间: 2008-8-3 15:18
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do set str=%%i&set/a n+=1,m=0&call:lp
- for /l %%i in (0 1 %m%) do if not "!%%ip!"=="" echo !%%ip!
- pause&goto :eof
- :lp
- set "%m%p=!%m%p!!str:~%m%,1!"
- if not "!str:~%m%,1!"=="" set/a m+=1&goto lp
复制代码
作者: terse 时间: 2008-8-3 16:33
行的字符不同处理- @echo off&setlocal enabledelayedexpansion
- set t=0
- for /f "delims=" %%i in (a.txt) do set str=%%i&set/a n+=1,m=1&call:lp
- for /l %%i in (1 1 %t%) do (
- for /l %%j in (1 1 %n%) do if "!%%jp%%i!"=="" (set/p= <nul)else set/p=!%%jp%%i!<nul
- echo.
- )
- pause&goto :eof
- :lp
- set "%n%p%m%=%str:~,1%"
- set "str=%str:~1%"
- if defined str set/a m+=1&goto lp
- if %m% gtr %t% set/a t=m
复制代码
作者: sjzong 时间: 2009-4-24 18:36 标题: 第一题
发错了!还是先向别人学习
[ 本帖最后由 sjzong 于 2009-4-24 18:38 编辑 ]
作者: keen 时间: 2009-4-26 22:35
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (
- set v=%%i
- set n=0
- call :lp
- )
- for /l %%i in (1 1 %n%) do (
- set num=%%i
- call,echo %%_!num!%%
- )
- pause&exit/b
- :lp
- set /a n+=1
- set _%n%=!_%n%!%v:~0,1%
- set v=%v:~1%
- if not "%v%"=="" goto lp
- goto :eof
复制代码
作者: keen 时间: 2009-4-26 22:44
回复batman
不是说我不想帮助别人,只是不知道怎么样去帮助别人。
我觉得自己的技术还不够成熟,怕给别人说错了,误导别人,这个责任我担不起。
作者: netbenton 时间: 2009-4-26 23:31
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (set v=%%i&call :lp)
- for /l %%i in (0 1 %n%) do (echo.!#%%i!)
- pause&goto :eof
-
- :lp
- for /l %%a in (0,1,100) do (if "!v:~%%a,1!"=="" (set n=%%a&goto :eof) else (set #%%a=!#%%a!!v:~%%a,1!))
复制代码
作者: jt10086 时间: 2009-4-27 10:58
新人,来学习学习,支持楼主了,说实话看了就头大,吼吼
作者: zhouyongjun 时间: 2009-6-22 20:06
支持每行字符数不同- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (set/a n+=1&set "_!n!=%%a")
- :loop
- for /l %%i in (1,1,%n%) do (
- if defined _%%i (<nul set/p=!_%%i:~,1!&set _%%i=!_%%i:~1!) else (set/p= <nul)
- )
- echo/&for /l %%i in (1,1,%n%) do if defined _%%i goto loop
- pause
复制代码
作者: CrLf 时间: 2011-3-12 13:00
看错题意,算了...
[ 本帖最后由 zm900612 于 2011-3-12 13:01 编辑 ]
作者: CrLf 时间: 2011-3-13 12:30
哈哈,这题么,全是单字节字符,正好用上cmd /u- @echo off&setlocal enabledelayedexpansion
- find /v "" a.txt
- echo 以下为纵横转换结果:
- for /f "skip=1 delims=:" %%a in ('(type a.txt^&echo;^)^|findstr /o .*') do (
- set /a ho=%%a-2,l=ho-last-2,last=ho,"max+=(max-l)*((max-l)>>31)"
- set o=!o!!ho!
- )
- set n=1
- for /f "delims=" %%a in ('cmd /u /c type a.txt^|more') do (
- for /f "tokens=1,2" %%x in ("!n! !o!") do (
- set .!n!=!.%%x!%%a
- set /a n+=1,m+=1
- if !m!==%%y (
- for /l %%z in (!n! 1 %max%) do set ".%%z=!.%%z! "
- set o=!o:* =!&set /a n=1,m+=2
- )
- )
- )
- for /l %%a in (1 1 %max%) do echo [!.%%a!]
- pause
复制代码
[ 本帖最后由 zm900612 于 2011-3-13 12:31 编辑 ]
作者: qzwqzw 时间: 2011-3-15 16:05
贴一个正统的解法
用到了临时文件
得亏事先造好了声势
可以不用偷偷摸摸了
楼主号称5句代码能够解题
等待瞻仰中……- @echo off & setlocal EnableDelayedExpansion
- rem 重置可能影响程序的环境变量为空
- for %%e in (lines context sizes cols) do set %%e=
-
- rem 将所有文本行拼成一行,并统计行数
- for /f "delims=" %%l in (a.txt) do set /a lines+=1&set "context=!context!%%l"
-
- rem 获取文本总字节数,并依此计算列数和列边界
- (echo %context%)>b.txt
- for %%f in (b.txt) do set /a sizes=%%~zf-2,cols=sizes/lines,collimit=cols-1
-
- rem 依照字符坐标转换,依次输出各列字符
- for /l %%i in (0,1,%collimit%) do (
- for /l %%j in (%%i,%cols%,%sizes%) do set/p=!context:~%%j,1!<nul
- echo.
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2021-4-7 14:54
- @echo off
- set /p char=<a.txt
- set n=0
- :o
- if not "%char%"=="" (
- set /a n+=1
- set char=%char:~1%
- goto :o
- )
- set /a n-=1
- setlocal enabledelayedexpansion
- for /l %%b in (0,1,%n%) do (
- for /f "delims=" %%a in (a.txt) do (
- set "str=%%a"
- set str%%b=!str%%b!!str:~%%b,1!
- )
- echo !str%%b!
- )
- pause
复制代码
作者: lengmoke 时间: 2021-10-11 10:10
- @echo off
- Setlocal EnableDelayedExpansion
- set maxlength=0
- for /f "delims=" %%i in (a.txt) do (
- call :len "%%i" length
- set "number=!number! !length!"
- set "list=!list!%%i"
- )
- for /l %%i in (1,1,%maxlength%) do (
- set /a x=0
- set "temp="
- for %%j in (%number%) do (
- set /a m=!x!+%%i-1
- call set temp=!temp!%%list:~!m!,1%%
- set /a x+=%%j
- )
- echo !temp!
- )
- exit
- :len
- set "strs=%~1" & set /a n=0
- :loop
- if defined strs (
- set strs=%strs:~1%
- set /a n+=1
- goto:loop
- )
- if %maxlength% lss %n% (
- set maxlength=%n%
- )
- set %2=%n%
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |