中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
作者:
标题: [已结]批处理字符重排 上一主题 | 下一主题
sady2009
初级用户





积分 58
发帖 60
注册 2009-2-18
状态 离线
『楼 主』:  [已结]批处理字符重排

有一文本文件a.txt 内容如下: 1,6,11 2,7,12 3,8,13 4,9,14 5,10,15 16,18,22 17,20,23 18,21,24 25,28,31 26,29,32 27,30,33 每一段行数不定,段与段中间有空行分割. 1,2,3不一定是数,这里只是代表一下. 要求处理后.输出 1 2 3 4 5 6 . (省略) 33 可以做到吗? [ Last edited by sady2009 on 2009-4-9 at 11:26 ]


2009-4-9 04:21
查看资料  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

没看懂。 1,2,3不一定是数 那是什么? 每一段行数不定,段与段中间有空行分割,你的输出与段有什么关系?




致精致简!
2009-4-9 05:00
查看资料  发短消息  网志   编辑帖子  回复  引用回复
dwj61909
新手上路





积分 18
发帖 10
注册 2008-4-5
状态 离线
『第 3 楼』:  

写了一个 不知道行不行 xxxx.txt 就是输出结果
set n=0 set m=0 setlocal enabledelayedexpansion for /f "tokens=1,2 delims=:" %%a in ('findstr /N . 2.txt') do ( set /a n+=1 set /a m+=1 if !n! EQU %%a (echo %%b>>tmp.txt) else (call :aa !m! & echo %%b>tmp.txt && set /a n+=1 && set /a m=1) ) call :aa !m!+1 endlocal exit :aa echo %~1 set /a xc=%~1-1 echo %xc% set pp=1 setlocal enabledelayedexpansion for /f "tokens=1-3 delims=," %%a in (tmp.txt) do ( set /a xz=!pp!+!xc! set /a xx=!pp!+2*!xc! set !pp!=%%a set !xz!=%%b set !xx!=%%c set /a pp+=1 ) set /a tf=3*!xc! echo !tf! for /l %%i in (1,1,!tf!) do ( echo.!%%i!>>xxxx.txt ) endlocal goto :eof


   此帖被 +1 点积分    点击查看详情   
评分人:【 sady2009 分数: +1  时间:2009-4-9 09:52


2009-4-9 07:20
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 4 楼』:  

more +3 "%~f0">~tmp.js
cscript /logo ~tmp.js a.txt
del ~tmp.js&goto:eof
doConverting(WScript.arguments(0));

function doConverting(File_Path){
    N=3,p=0;
    fso=new ActiveXObject("scripting.filesystemobject");
    fso.CopyFile(File_Path,File_Path+".bak");
    var fl=fso.opentextfile(File_Path,1);
    var sss=fl.readall();
    var fl=fso.opentextfile(File_Path,2);
    sss=sss.replace(/\s*$/g,"");
    sss=sss.replace(/\r\n/g,",");
    sss=sss.replace(/,{2,}/g,"\n");
    sss=sss.split("\n");
    WScript.echo(sss.length);
    WScript.echo(sss);
    var oString=new Array();
    for(i=0;i<sss.length;i++){
        var tmpstring=new Array()
         tmpstring=sss[i].split(",");
         for(j=0;j<N;j++){
             for(k=0+j;k<tmpstring.length;k=k+N,p++){
                 oString[p]=tmpstring[k];
             }
         }
    }
    fl.write(oString.join('\r\n'));
}


2009-4-9 07:58
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 5 楼』:  

@echo off (for /f "tokens=1* delims=, " %%a in (a.txt) do echo %%a)>b.txt




精简 [你的+我的+他的]=>[大家的] 个人网志
2009-4-9 08:06
查看资料  发送邮件  发短消息  网志  OICQ (37659560)  编辑帖子  回复  引用回复
sady2009
初级用户





积分 58
发帖 60
注册 2009-2-18
状态 离线
『第 6 楼』:  

谢谢各位,问题还没能解决。 这个问题比较复杂. 我的思路是, 先将每一段分割开来(如何分割还没想到)。比如第一段分出来暂存为a1.txt 1,6,11 2,7,12 3,8,13 4,9,14 5,10,15 对这一段: @echo off&setlocal enabledelayedexpansion for /l %%m in (1,1,4) do ( set var=%%m for /f "tokens=1-3 delims=," %%x in (a1.txt) do (if !var! equ 1 (echo %%x>>b.txt) else if !var! equ 2 (echo %%y>>b.txt) else if !var! equ 3 (echo %%z>>b.txt)) ) 然后再对 第2,3,~n 段处理 最终形成 1 2 3 . 第个段行数是不确定的。 此处的1 2 3代表一段字符串,为了使问题简单化,才用数字暂代的。 处理后的结果必须按照顺序输出。楼上想的太简单了 3楼的朋友用数字是可行的。用字符串不合要求(可能是我的字串中含有:的关系)。 4楼的朋友运行出错,我也不太懂其他脚本语言。 不管怎样,非常感谢! [ Last edited by sady2009 on 2009-4-9 at 10:04 ]


2009-4-9 09:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复
freeants001
中级用户




积分 330
发帖 244
注册 2006-4-14
来自 湖北
状态 离线
『第 7 楼』:  

more +3 "%~f0">~tmp.js
cscript /logo ~tmp.js a.txt
del ~tmp.js&goto:eof
//doConverting(WScript.arguments(0));
doConverting("a.txt")

function doConverting(File_Path){
    N=3,p=0;
    fso=new ActiveXObject("scripting.filesystemobject");
    var fl=fso.opentextfile(File_Path,1);
    var sss=fl.readall();fl.close();
    var fl=fso.opentextfile(File_Path.slice(0,-3)+"_处理后.log",2,true);
    sss=sss.replace(/\s*$/g,"");
    sss=sss.replace(/\r\n\s*\r\n/g,"\r\n\r\n");
    blocks=sss.split("\r\n\r\n")
    for(i=0;i<blocks.length;i++){
        var fl2=fso.opentextfile(File_Path.slice(0,-4)+"_第"+i+"段"+".log",2,true);
        fl2.write(blocks[i])
    }
    sss=sss.replace(/\r\n/mg,",");
    sss=sss.replace(/,{2,}/g,"\n");
    sss=sss.split("\n");
    var oString=new Array();
    for(i=0;i<sss.length;i++){
        var tmpstring=new Array()
         tmpstring=sss[i].split(",");
         for(j=0;j<N;j++){
             for(k=0+j;k<tmpstring.length;k=k+N,p++){
                 oString[p]=tmpstring[k];
             }
         }
    }
    fl.write(oString.join('\r\n'));
}


   此帖被 +1 点积分    点击查看详情   
评分人:【 sady2009 分数: +1  时间:2009-4-9 10:13


2009-4-9 09:56
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
sady2009
初级用户





积分 58
发帖 60
注册 2009-2-18
状态 离线
『第 8 楼』:  

呵,这里真是高手如云啊。 谢谢楼上的朋友。其本上达到目的,不过我的文本中某些字串中含有时间的. 比如 08:00 QETRWQET,09:00 tyiutyiti, 等,结果出来时间中间的":" 变没了。不过这个我可以自己做批处理加上。 另外再求更加优化的代码。生成的 临时文件太多了 [ Last edited by sady2009 on 2009-4-9 at 10:22 ]


2009-4-9 10:19
查看资料  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

如果你的文本中有冒号有英文字母,应该给出一部分样本文件,再给出相应的成品文件,别人才好写代码。




致精致简!
2009-4-9 10:50
查看资料  发短消息  网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 10 楼』:  不生成临时文件,不丢失冒号

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=:" %%a in ('findstr /n .* a.txt') do (
	set/a n+=1
	if "%%b"=="" (
		set/a n-=1
		for %%f in (aa bb cc) do (call :sub %%f)
		set/a n=0
			
	) else (
		for /f "tokens=1-3 delims=," %%f in ('echo %%b') do (
			set "aa.!n!=%%f"&set "bb.!n!=%%g"&set "cc.!n!=%%h"
		)
	)
)
for %%f in (aa bb cc) do (call :sub %%f)
pause
goto :eof
:sub
for /l %%a in (1,1,%n%) do (echo !%1.%%a!)
goto :eof
[ Last edited by netbenton on 2009-4-9 at 10:59 ]




精简 [你的+我的+他的]=>[大家的] 个人网志
2009-4-9 12:27
查看资料  发送邮件  发短消息  网志  OICQ (37659560)  编辑帖子  回复  引用回复
sady2009
初级用户





积分 58
发帖 60
注册 2009-2-18
状态 离线
『第 11 楼』:  

非常谢谢。楼上的代码 完全符合我的要求。太棒了!


2009-4-9 12:59
查看资料  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





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

居然和10楼思路完全一样
@echo off&setlocal enabledelayedexpansion
set "f=^(type a.txt^&echo.^&echo.^)^|findstr /n .*"
set flag=&set "flag2="
for /f "tokens=1* delims=:" %%a in ('%f%') do (
   if not defined flag setlocal&set flag=a
   if "%%b"==" " set flag2=a
   if "%%b"=="" set flag2=a
   if defined flag2 (
      for /l %%l in (1 1 3) do (
         for /l %%m in (1 1 !n!) do echo !num%%m.%%l!
      )
      echo.&endlocal
    ) else (
      set /a n+=1
      for /f "tokens=1-3 delims=," %%i in ("%%b") do (
         set num!n!.1=%%i&set num!n!.2=%%j&set num!n!.3=%%k
      )
    )
)
pause
[ Last edited by 26933062 on 2009-4-9 at 14:26 ]


   此帖被 +5 点积分       点击查看详情   
评分人:【 netbenton 分数: +5  时间:2009-4-9 14:55




致精致简!
2009-4-9 13:42
查看资料  发短消息  网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 13 楼』:  学习楼上的方法,再度精简

@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims=: " %%a in ('findstr /n .* a.txt^&echo.0:') do (
	if "%%b"=="" (
		for /l %%f in (1,1,3) do (
			for /l %%g in (1,1,!n!) do (echo !m%%f.%%g!)
		)
		set n=0
			
	) else (
		set/a n+=1
		for /f "tokens=1-3 delims=," %%f in ("%%b") do (
			set "m1.!n!=%%f"&set "m2.!n!=%%g"&set "m3.!n!=%%h"
		)
	)
)
pause
goto :eof
楼上让我学会了for /f "tokens=1-3 delims=," %%f in ("%%b") do ( 的用法,速度快了好多,谢谢 [ Last edited by netbenton on 2009-4-9 at 12:50 ]




精简 [你的+我的+他的]=>[大家的] 个人网志
2009-4-9 14:35
查看资料  发送邮件  发短消息  网志  OICQ (37659560)  编辑帖子  回复  引用回复
26933062
银牌会员





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

最好写成 findstr /n .* a.txt^&echo.^&echo.0: 以防止源文件最后一行不是空行。 'findstr /n .* a.txt^&echo.0: 比我的好多了,我的绕弯路了。。。 [ Last edited by 26933062 on 2009-4-9 at 15:04 ]




致精致简!
2009-4-9 14:53
查看资料  发短消息  网志   编辑帖子  回复  引用回复
sady2009
初级用户





积分 58
发帖 60
注册 2009-2-18
状态 离线
『第 15 楼』:  

Originally posted by netbenton at 2009-4-9 14:35: [code]@echo off&setlocal enabledelayedexpansion for /f "tokens=1* delims=: " %%a in ('findstr /n .* a.txt^&echo.0:') do ( if "%%b"=="" ( for /l %%f in (1 ...
速度要比前一个快太多了。 暂时没完全看懂。需要点时间消化。 [ Last edited by sady2009 on 2009-4-9 at 21:24 ]


2009-4-9 21:22
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: