中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-16 00:28
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]批处理字符重排 查看 1,032 回复 14
楼 主 [已结]批处理字符重排 发表于 2009-04-09 04:21 ·  中国 浙江 温州 苍南县 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
UID 139163
性别 男
状态 离线
有一文本文件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 ]
2 发表于 2009-04-09 05:00 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
没看懂。
1,2,3不一定是数 那是什么?
每一段行数不定,段与段中间有空行分割,你的输出与段有什么关系?
致精致简!
3 发表于 2009-04-09 07:20 ·  中国 北京 鹏博士BGP
新手上路
积分 18
发帖 10
注册 2008-04-05 18:38
UID 115045
性别 男
状态 离线
写了一个 不知道行不行
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-04-09 09:52
4 发表于 2009-04-09 07:58 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
UID 53823
性别 男
来自 湖北
状态 离线
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.split(",");
for(j=0;j<N;j++){
for(k=0+j;k<tmpstring.length;k=k+N,p++){
oString=tmpstring;
}
}
}
fl.write(oString.join('\r\n'));
}
5 发表于 2009-04-09 08:06 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
UID 135147
性别 男
来自 广西
状态 离线
@echo off
(for /f "tokens=1* delims=, " %%a in (a.txt) do echo %%a)>b.txt
精简
=> 个人网志
6 发表于 2009-04-09 09:34 ·  中国 浙江 温州 苍南县 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
UID 139163
性别 男
状态 离线
谢谢各位,问题还没能解决。
这个问题比较复杂.


我的思路是, 先将每一段分割开来(如何分割还没想到)。比如第一段分出来暂存为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 ]
7 发表于 2009-04-09 09:56 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
UID 53823
性别 男
来自 湖北
状态 离线
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)
}
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.split(",");
for(j=0;j<N;j++){
for(k=0+j;k<tmpstring.length;k=k+N,p++){
oString=tmpstring;
}
}
}
fl.write(oString.join('\r\n'));
}
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
sady2009 +1 2009-04-09 10:13
8 发表于 2009-04-09 10:19 ·  中国 浙江 温州 苍南县 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
UID 139163
性别 男
状态 离线
呵,这里真是高手如云啊。

谢谢楼上的朋友。其本上达到目的,不过我的文本中某些字串中含有时间的.
比如 08:00 QETRWQET,09:00 tyiutyiti, 等,结果出来时间中间的":" 变没了。不过这个我可以自己做批处理加上。

另外再求更加优化的代码。生成的 临时文件太多了

[ Last edited by sady2009 on 2009-4-9 at 10:22 ]
9 发表于 2009-04-09 10:50 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
如果你的文本中有冒号有英文字母,应该给出一部分样本文件,再给出相应的成品文件,别人才好写代码。
致精致简!
10 不生成临时文件,不丢失冒号 发表于 2009-04-09 12:27 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
UID 135147
性别 男
来自 广西
状态 离线
@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 ]
精简
=> 个人网志
11 发表于 2009-04-09 12:59 ·  中国 浙江 温州 苍南县 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
UID 139163
性别 男
状态 离线
非常谢谢。楼上的代码 完全符合我的要求。太棒了!
12 发表于 2009-04-09 13:42 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
居然和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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
netbenton +5 2009-04-09 14:55
致精致简!
13 学习楼上的方法,再度精简 发表于 2009-04-09 14:35 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
UID 135147
性别 男
来自 广西
状态 离线
@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 ]
精简
=> 个人网志
14 发表于 2009-04-09 14:53 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
最好写成 findstr /n .* a.txt^&echo.^&echo.0: 以防止源文件最后一行不是空行。

'findstr /n .* a.txt^&echo.0: 比我的好多了,我的绕弯路了。。。

[ Last edited by 26933062 on 2009-4-9 at 15:04 ]
致精致简!
15 发表于 2009-04-09 21:22 ·  中国 浙江 温州 苍南县 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
UID 139163
性别 男
状态 离线
Originally posted by netbenton at 2009-4-9 14:35:
@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 ]
论坛跳转: