中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-22 00:23
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 还是两个文本输出的问题:按列合并两个文本文件 查看 2,294 回复 16
楼 主 还是两个文本输出的问题:按列合并两个文本文件 发表于 2008-04-02 17:12 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
a.txt
aaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb
cccccccccccccccc dddddddddddddddddddd
eeeeeeeeeeeeeeee ffffffffffffffffffff
gggggggggggggggg hhhhhhhhhhhhhhhhhhhh
iiiiiiiiiiiiiiii jjjjjjjjjjjjjjjjjjjj

b.txt
1111111111111111111111 222222222222222222222222
3333333333333333333333 555555555555555555555555
9999999999999999999999 7777777777777777777777777
8888888888888888888888 4444444444444444444444444
6666666666666666666666 0000000000000000000000000

通过批处理输出内容如下:
aaaaaaaaaaaaaaaa 222222222222222222222222
bbbbbbbbbbbbbbbbbbbb 1111111111111111111111
cccccccccccccccc 555555555555555555555555
dddddddddddddddddddd 3333333333333333333333
eeeeeeeeeeeeeeee 7777777777777777777777777
ffffffffffffffffffff 9999999999999999999999
gggggggggggggggg 4444444444444444444444444
hhhhhhhhhhhhhhhhhhhh 8888888888888888888888
iiiiiiiiiiiiiiii 0000000000000000000000000
jjjjjjjjjjjjjjjjjjjj 6666666666666666666666

要求:
1 不生成任何临时文件
2 尽量简洁代码
3 a.txt和b.txt可互换
4 效率高
===================================
到目前最完美的方案(17楼):
@echo off
set n=-1
for /f "tokens=1,2" %%i in (a.txt) do (
call :lp %%i %%j
)
pause&goto :eof
:lp
set /a n+=1
set m=skip=%n%
if "%m%"=="skip=0" set m=
for /f "%m% tokens=1,2" %%i in (b.txt) do (
echo %1 %%j&echo %2 %%i&goto :eof
)


───────────────── 版务记录 ─────────────────
执行:HAT
操作:在帖子标题中增加搜索关键字
说明:原标题"还是两个文本输出的问题:"不利于论坛搜索
───────────────── 版务记录 ─────────────────


[ Last edited by HAT on 2008-10-4 at 13:48 ]
批处理之家新域名:www.bathome.net
2 没人来试试吗? 发表于 2008-04-02 17:20 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
我自己来抛砖引玉了,如下:
@echo off 
set n=-1
:begin
set /a n+=1
set m=skip=%n%
if "%m%"=="skip=0" set m=
for /f "%m% tokens=1,2" %%i in ('findstr /n .* a.txt') do call :lp %%i %%j
goto :eof
:lp
for /f "%m% tokens=1,2" %%i in ('findstr /n .* b.txt') do (
set a=%1
set b=%%i
setlocal enabledelayedexpansion
if "!a:~,2!"=="!b:~,2!" echo !a:~2,50! %%j&echo %2 !b:~2,50!
endlocal
goto begin
)

这个代码最大的问题就是效率的问题。
批处理之家新域名:www.bathome.net
3 发表于 2008-04-02 17:20 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
试试ruby吧,应该是很简单的事儿。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw -1 2008-04-02 20:54
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
4 简洁2楼代码并提高效率如下: 发表于 2008-04-02 18:36 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
@echo off
set n=0
for /f "tokens=1,2" %%i in ('findstr /n .* a.txt') do (
set /a n+=1
set a=%%i
setlocal enabledelayedexpansion
if "!a:~,1!"=="!n!" call :lp %%i %%j
endlocal
)
goto :eof
:lp
for /f "tokens=1,2" %%i in ('findstr /n .* b.txt') do (
set a=%1
set b=%%i
if "!b:~,1!"=="!n!" echo !a:~2,50! %%j&echo %2 !b:~2,50!&goto :eof
)


[ Last edited by zw19750516 on 2008-4-2 at 06:40 PM ]
批处理之家新域名:www.bathome.net
5 发表于 2008-04-02 18:39 ·  中国 江苏 苏州 移动
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
18年会员
UID 99089
性别 男
状态 离线
!a:~2,50!
这样做是不是通用性就降低了
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
bat-zw +4 2008-04-02 18:57
6 增加通用性: 发表于 2008-04-02 18:54 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by huahua0919 at 2008-4-2 18:39:
!a:~2,50!
这样做是不是通用性就降低了

@echo off
set n=0
for /f "tokens=1,2" %%i in ('findstr /n .* a.txt') do (
set /a n+=1
set a=%%i
setlocal enabledelayedexpansion
if "!a:~,1!"=="!n!" call :lp %%i %%j
endlocal
)
pause&goto :eof
:lp
for /f "tokens=1,2" %%i in ('findstr /n .* b.txt') do (
set a=%1
set b=%%i
if "!b:~,1!"=="!n!" set a=!a:*:=!&set b=!b:*:=!&echo !a! %%j&echo %2 !b!&goto :eof
)
批处理之家新域名:www.bathome.net
7 发表于 2008-04-02 19:49 ·  中国 广西 玉林 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
@echo off
set n=0
for /f "tokens=1,2 delims=" %%i in (a.txt) do (
call :lp %%i
set /a n+=1
)
pause
exit

:lp
if %n% gtr 0 for /f "skip=%n% tokens=1,2" %%i in (b.txt) do echo %1 %%j&echo %2 %%i&goto :eof
for /f "tokens=1,2" %%i in (b.txt) do echo %1 %%j&echo %2 %%i&goto :eof
8 发表于 2008-04-02 20:43 ·  中国 江苏 常州 武进区 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
a和b文件行数不一样怎么办啊
@echo off
for /f "tokens=1,2" %%i in (a.txt) do call :loop %%i %%j
for /f "%n% tokens=1,2" %%i in (b.txt) do echo/%%j&echo/%%i
for /f "%n% tokens=1,2" %%i in (a.txt) do echo/%%i&echo/%%j
pause
goto :eof
:loop
for /f "%n% tokens=1-3 delims=: " %%i in ('findstr /n .* "b.txt"') do (
set n=skip=%%i&set str=%%j
if defined str (call set/p=%1 %%k<nul&echo.&call set/p=%2 %%str%%<nul&echo.) else call set/p=%1<nul&echo.&call set/p=%2<nul&echo.
goto :eof
)

楼主回复 :行数不一样,就不存在用这种输出方式了
这样也可以:
@echo off
for /f "tokens=1,2" %%i in (a.txt) do set/p=%%i <nul&call :loop %%i %%j
pause
goto :eof
:loop
for /f "%n% tokens=1-3 delims=: " %%i in ('findstr /n .* "b.txt"') do (
set n=skip=%%i&set str=%%j&set/p=%%k<nul&echo.
if defined str (call set/p=%2 %%str%%<nul&echo.) else call set/p=%2 %1<nul&echo.
goto :eof
)

[ Last edited by terse on 2008-4-2 at 09:04 PM ]
简单!简单!再简单!
9 发表于 2008-04-02 20:43 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by zh159 at 2008-4-2 19:49:
@echo off
set n=0
for /f "tokens=1,2 delims=" %%i in (a.txt) do (
call :lp %%i
set /a n+=1
)
pause
exit

:lp
if %n% gtr 0 for /f "skip=%n% tokens=1,2" %% ...

老兄的代码怕是存在效率问题啊。
批处理之家新域名:www.bathome.net
10 发表于 2008-04-02 20:47 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by terse at 2008-4-2 20:43:
a和b文件行数不一样怎么办啊
@echo off
for /f "tokens=1,2" %%i in (a.txt) do set/p=%%i <nul&call :loop %%j
for /f "%n% tokens=1,2" %%i in (b.txt) do echo/%%j ...

行数不一样,就不存在用这种输出方式了。
批处理之家新域名:www.bathome.net
11 继续提效: 发表于 2008-04-02 23:53 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
@echo off
set n=0
for /f "tokens=1,2" %%i in ('findstr /n .* a.txt') do (
set /a n+=1
set /a m=n-1
set a=%%i
setlocal enabledelayedexpansion
if "!a:~,1!"=="!n!" call :lp %%i %%j
endlocal
)
pause&goto :eof
:lp
set skip=skip=!m!
if "!skip!"=="skip=0" set skip=
for /f "%skip% tokens=1,2" %%i in ('findstr /n .* b.txt') do (
set a=%1
set b=%%i
if "!b:~,1!"=="!n!" set a=!a:*:=!&set b=!b:*:=!&echo !a! %%j&echo %2 !b!
&goto :eof
)
批处理之家新域名:www.bathome.net
12 发表于 2008-04-03 00:10 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
Originally posted by zw19750516 at 2008-4-2 20:43:

老兄的代码怕是存在效率问题啊。


不知道你试过了没有......
你6楼代码测试:
开始时间:22:47:10.00
结束时间:22:47:12.95
需时:2.95秒

你11楼代码测试:
开始时间:22:52:40.00
结束时间:22:52:43.48
需时:3.48秒

我7 楼的代码测试
开始时间:22:47:20.00
结束时间:22:47:20.03
需时:0.03秒


测试方式:
@echo off
:loop
set time_=%time%
if not %time_:~-4% == 0.00 goto loop

set n=0
for /f "tokens=1,2 delims=" %%i in (a.txt) do (
call :lp %%i
set /a n+=1
)
echo %time_%
echo %time%

pause
exit

:lp
if %n% gtr 0 for /f "skip=%n% tokens=1,2" %%i in (b.txt) do echo %1 %%j&echo %2 %%i&goto :eof
for /f "tokens=1,2" %%i in (b.txt) do echo %1 %%j&echo %2 %%i&goto :eof
13 发表于 2008-04-03 00:31 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
Originally posted by zh159 at 2008-4-3 00:10:


不知道你试过了没有......
你6楼代码测试:

你11楼代码测试:

我7 楼的代码测试


测试方式:

是findstr的问题吗?
批处理之家新域名:www.bathome.net
14 发表于 2008-04-03 02:18 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
就效率方面 应该是zh159兄的更胜一筹
简单!简单!再简单!
15 发表于 2008-04-03 10:22 ·  中国 陕西 西安 电信
初级用户
替身
积分 122
发帖 17
注册 2008-03-27 10:12
18年会员
UID 114154
性别 男
状态 离线
本人测试过100000次if 否定判断用时1.63秒, 执行效率61349次/秒
call 空语句 10000次 用时10.907秒,执行效率917.496次/秒
findstr .* test.txt>nul 100次 用时3.55秒, 执行效率28.169次/秒

(test为 一个10行文字的文本文件)

@echo off||{jv|08-04-03}
echo 当前时间:%time%
setlocal enabledelayedexpansion
for /f "tokens=1-2" %%a in (a.txt) do (
set/a n+=1,m=0
for /f "tokens=1-2" %%c in (b.txt) do (
if !m! leq !n! set/a m+=1
if !m!==!n! echo %%a %%d&echo %%b %%c
))
echo 当前时间:%time%
pause>nul

附图:


[ Last edited by jvive on 2008-4-13 at 01:02 PM ]
进入网盘(各种工具)
论坛跳转: