Board logo

标题: 以解决:把文本内容横列变纵列。 [打印本页]

作者: 26933062     时间: 2008-4-22 21:12    标题: 以解决:把文本内容横列变纵列。

求助:把文本内容横列变纵列。 a.txt 不确定每行字符个数及行数。样本如下:
123456789
a   bde 0
    c f
	g
要求:代码效率不能太低,可以适当产生临时文件。 生成新文本内容如下:
1
a
2
3
4
5
b
c
g
6
d
7
e
f
8
9
0
[ Last edited by 26933062 on 2008-4-22 at 10:20 PM ]

作者: 26933062     时间: 2008-4-22 22:21
已经解决,谁有兴趣就当个题目来作吧。

作者: bat-zw     时间: 2008-4-22 22:22    标题: 支持一下:

现在的是能完全完成任务了,但就是效率有问题 --------------------------------------------------------------- 效率也提上来了,用时89微秒
@echo off&setlocal enabledelayedexpansion
set n=-1
:begin
set /a n+=1
for /f "delims=" %%i in ('type a.txt') do (
    set a=%%i
    set a=!a: =#!&set str=!a:~%n%,1!
    echo.!str!>>c.txt  
    if "%str%"=="g" goto :return
)
goto begin
:return
for /f "delims=# " %%i in (c.txt) do echo %%i
del /q c.txt
pause
[ Last edited by zw19750516 on 2008-4-22 at 11:36 PM ]

作者: bat-zw     时间: 2008-4-22 22:28
请楼主贴出代码以学习啊!

作者: pusofalse     时间: 2008-4-22 22:42
楼上的太强了,看过你的代码之后感觉也挺简单的,但为何没看之前,自己就是想不出来呢~ 敬佩!敬佩!~

作者: slore     时间: 2008-4-22 22:53
1a 2 3 4 5bc 6d 7ef 8 90 g [ Last edited by slore on 2008-4-22 at 10:59 PM ]

作者: bat-zw     时间: 2008-4-23 00:00    标题: 再来个不生成临时文件的:

运行时间5微秒
@echo off&setlocal enabledelayedexpansion
set n=-1
:begin
set /a n+=1
for /f "delims=" %%i in (a.txt) do (
    set a=%%i&set /a m+=1
    set "str!m!=!a:~%n%,1!"
    if "!str%m%!"=="g" goto :return
)
goto begin
:return
for /l %%i in (1,1,!m!) do if not "!str%%i!"==" " if not "!str%%i!"=="" echo !str%%i! 
pause>nul
[ Last edited by zw19750516 on 2008-4-23 at 12:28 AM ]

作者: terse     时间: 2008-4-23 00:06
@echo off&setlocal enabledelayedexpansion
set s=0
for /f "delims=" %%i in (aa.txt) do (
set/a n+=1,m=0
set "str=%%i"
call :lp
)
for /l %%i in (1,1,%s%) do (
   for /l %%j in (1,1,%n%) do (
   if not "!str%%j%%i!"==" " if not "!str%%j%%i!"=="" echo !str%%j%%i!
  )
)
pause
goto :eof
:lp
set/a m+=1
set str%n%%m%=!str:~0,1!
set str=!str:~1!
if defined str goto lp
if %m% gtr %s% set/a s=m

作者: bat-zw     时间: 2008-4-23 00:08
Originally posted by terse at 2008-4-23 00:06: [code] @echo off&setlocal enabledelayedexpansion set s=0 for /f "delims=" %%i in (aa.txt) do ( set/a n+=1,m=0 set "str=%%i" call :lp ) for /l %%i in (1,1,%s%) do ( ...
运行时间为14微秒

作者: 26933062     时间: 2008-4-23 00:10
因我实际需处理的文本内容只有○和●两种字符,所以比较简单. 急于完成手头的事情,所以未及考虑通用性和严谨 :
@echo off
set z=○&set x=●
:: 先把双字节替换成单字节,O为●,x为○。
setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
    set str=%%a
	set /a max+=1
	set str=!str:  = !
	set str=!str: =$ !
	set str=!!str:%z%=O !!
	set str=!!str:%x%=X !!
    set n!max!=!str!
)
for %%a in (!n1!) do (
   set /a l+=1
   for /l %%l in (1 1 !max!) do call :loop "!n%%l!"
)
endlocal
pause&exit
:loop
for /f "tokens=%l%" %%b in ("%~1") do (
   if not "%%b"=="$" (
	 set /a m+=1
	 echo %%b
))
goto :eof

作者: bat-zw     时间: 2008-4-23 00:15
Originally posted by 26933062 at 2008-4-23 00:10: 因我实际需处理的文本内容只有○和●两种字符,所以比较简单. 急于完成手头的事情,所以未及考虑通用性和严谨 :[code] @echo off set z=○&set x=● : ...
运行结果: 123456789 a$ ??????????????

作者: 26933062     时间: 2008-4-23 00:39
这是我的实际文本,先把他们替换成字母o和x再纵向列出. 没时间,偷空上上网.
○●○●○●○●○●○●○●○●○●○●○●○●○●
○      ○●○  ○  ○  ○●  ●      ●○●○●  ●
        ○●○  ○  ○        ●      ●  ●      ●
            ○  ○                    ●  ●        
            ○                        ●  ●        
            ○                        ●  ●        

作者: 26933062     时间: 2008-4-23 06:38
最终代码: 感谢各位的热心帮助.... 昨晚老是发现丢失数据,终于搞清了,原来for的tokens=的最大值是31 这里要提醒新手们注意了....... 7楼zw19750516 的代码思路是,把文本的每个字符都分别赋值给一个变量,最后再统一显示出来. 效率方面 文本最长的一行有多少字符,for就要把文本循环多少篇,感觉效率不是很高. 8楼 terse 的代码相当来说要好很多,代码效率没有浪费的部分,并行不用寻找关键字,(比如7楼的g,我的#号)不错,学习了. 感谢二位. :
@echo off&color 1f
setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
    set "str=%%a"
    set "str=!str: =#!"
    set /a max+=1
    for /l %%l in (0 1 100) do (
        if not "!str:~%%l,1!"==""  set sun=!sun! !str:~%%l,1!
    )
    set n!max!=!sun!&set "sun="
)
for %%a in (!n1!) do (
   for /l %%l in (1 1 !max!) do call :loop "!n%%l!" %%l
)
endlocal
pause
goto :eof

:loop
for /f %%b in ("%~1") do if not "%%b"=="#" set /a m+=1&echo %%b
set n%2=!n%2:~2!
goto :eof

作者: plp626     时间: 2008-4-23 13:44
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt)do set "str=%%a"&call:arr "%%str: =%%"
endlocal&pause
:arr
set x=%~1
for /l %%b in (1 1 500)do if not "!x:~%%b,1!"=="" (call echo\%%x:~%%b,1%%) else goto:eof

作者: 26933062     时间: 2008-4-23 18:36
plp626 没理解我的意识,也是我标题没说清楚。 看你的代码只是把文本横向内容纵向列出,而我的实际要求是,纵向依次显示出每个字符,即:第一行第一列的第一个。然后第二行第一列的第一个。。。。依此类推。。。。。

作者: terrytong     时间: 2008-4-23 19:02
这里高手真多啊,偶刚学,还没入门呢。以后大家多多指教...

作者: dreamseed     时间: 2008-4-23 19:53
 @echo off&setlocal enabledelayedexpansion
set max=0
for /f "delims=" %%i in (a.txt) do (
set /a i+=1
call :split "%%i" !i!)
for /l %%i in (0 1 %max%) do (
for /l %%j in (0 1 !i!) do (
set t=!s_%%j_%%i!
if not "!t!" == "" if not "!t!" == " " echo !t!))
pause&exit
:split
set c=-1&set s=%~1
:next
set /a c+=1
if not "!s:~%c%,1!" == "" (
set s_%2_%c%=!s:~%c%,1!
goto next
) else if %c% gtr %max% set max=%c%
写了个。完后参看前辈们写的,发觉和terse的接近了。 刚才试着处理1K左右的不同文本,私下觉得这个是最快的。 [ Last edited by dreamseed on 2008-4-23 at 08:28 PM ]

作者: ZJHJ     时间: 2008-4-24 21:11
有些特殊字符不支持

作者: amao     时间: 2008-4-25 10:02
仔细一看才明白你的意思。刚才回复出错。 [ Last edited by amao on 2008-4-25 at 10:08 AM ]

作者: huahua0919     时间: 2008-4-25 11:29
写的太多了
@echo off&&setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (a.txt) do (
set str=%%i
set str=!str: =!&call :lp
)
pause
:lp
echo !str:~0,1!&set str=!str:~1!&if defined str goto :lp&goto :eof

作者: netbenton     时间: 2009-1-3 02:24    标题: 回复17楼

君的代码处遇上%时会丢失. 我参考大家的写了一段,有处理空行时会出现重复的问题, 哪位帮解决一下: @echo off & setlocal enabledelayedexpansion set m=0&set n=0&set en=y :angin call :lp set /a m+=1&if not defined endy goto :angin pause&goto :eof :lp if !m!==0 (set skip= ) else (set skip="skip=%m% delims=") for /f %skip% %%i in (a.txt) do ( set str=%%i set str=!str:~ %n%,1! if not defined str goto :eof set en=n&if not "!str!"==" " echo !str! goto :eof ) set m=-1&set /a n+=1&if !en!==y set endy=q set en=y&goto :eof