中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 以解决:把文本内容横列变纵列。
« [1] [2] »
作者:
标题: 以解决:把文本内容横列变纵列。 上一主题 | 下一主题
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『楼 主』:  以解决:把文本内容横列变纵列。

求助:把文本内容横列变纵列。
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 ]



致精致简!
2008-4-22 21:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 2 楼』:  

已经解决,谁有兴趣就当个题目来作吧。



致精致简!
2008-4-22 22:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 3 楼』:  支持一下:

现在的是能完全完成任务了,但就是效率有问题
---------------------------------------------------------------
效率也提上来了,用时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 ]



批处理之家新域名:www.bathome.net
2008-4-22 22:22
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 4 楼』:  

请楼主贴出代码以学习啊!



批处理之家新域名:www.bathome.net
2008-4-22 22:28
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 5 楼』:  

楼上的太强了,看过你的代码之后感觉也挺简单的,但为何没看之前,自己就是想不出来呢~
敬佩!敬佩!~

2008-4-22 22:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 6 楼』:  

1a  
2   
3   
4   
5bc
6d  
7ef
8   
90 g

[ Last edited by slore on 2008-4-22 at 10:59 PM ]

2008-4-22 22:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 7 楼』:  再来个不生成临时文件的:

运行时间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 ]

   此帖被 +3 点积分     点击查看详情   
评分人:【 26933062 分数: +3  时间:2008-4-23 06:38




批处理之家新域名:www.bathome.net
2008-4-23 00:00
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 8 楼』:  


@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


   此帖被 +5 点积分      点击查看详情   
评分人:【 26933062 分数: +5  时间:2008-4-23 06:38




简单!简单!再简单!
2008-4-23 00:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 9 楼』:  



  Quote:
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微秒



批处理之家新域名:www.bathome.net
2008-4-23 00:08
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 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




致精致简!
2008-4-23 00:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 11 楼』:  



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

运行结果:
123456789
a$
??????????????



批处理之家新域名:www.bathome.net
2008-4-23 00:15
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 12 楼』:  

这是我的实际文本,先把他们替换成字母o和x再纵向列出.
没时间,偷空上上网.
○●○●○●○●○●○●○●○●○●○●○●○●○●
○      ○●○  ○  ○  ○●  ●      ●○●○●  ●
        ○●○  ○  ○        ●      ●  ●      ●
            ○  ○                    ●  ●        
            ○                        ●  ●        
            ○                        ●  ●        




致精致简!
2008-4-23 00:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 13 楼』:  

最终代码:
    感谢各位的热心帮助....
    昨晚老是发现丢失数据,终于搞清了,原来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




致精致简!
2008-4-23 06:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 14 楼』:  


@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




山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-23 13:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 15 楼』:  

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



致精致简!
2008-4-23 18:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: