|
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 就是输出结果
Quote: | 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 |
|
|
|
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 |
|
|
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'));
}
|
|
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 来自 广西
状态 离线
|
|
2009-4-9 12:27 |
|
|
sady2009
初级用户
积分 58
发帖 60
注册 2009-2-18
状态 离线
|
『第
11 楼』:
非常谢谢。楼上的代码 完全符合我的要求。太棒了!
|
|
2009-4-9 12:59 |
|
|
26933062
银牌会员
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
|
2009-4-9 13:42 |
|
|
netbenton
银牌会员
批处理编程迷
积分 1916
发帖 752
注册 2008-12-28 来自 广西
状态 离线
|
|
2009-4-9 14:35 |
|
|
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 楼』:
Quote: | 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 |
|
|