中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 还是两个文本输出的问题:按列合并两个文本文件
« [1] [2] »
作者:
标题: 还是两个文本输出的问题:按列合并两个文本文件 取消高亮 | 上一主题 | 下一主题
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『楼 主』:  还是两个文本输出的问题:按列合并两个文本文件

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
2008-4-2 17:12
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 2 楼』:  没人来试试吗?

我自己来抛砖引玉了,如下:
@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
2008-4-2 17:20
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 3 楼』:  

试试ruby吧,应该是很简单的事儿。

   此帖被 -1 点积分     点击查看详情   
评分人:【 bat-zw 分数: -1  时间:2008-4-2 20:54




偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2008-4-2 17:20
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 4 楼』:  简洁2楼代码并提高效率如下:


@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
2008-4-2 18:36
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 5 楼』:  

!a:~2,50!
这样做是不是通用性就降低了

   此帖被 +4 点积分        点击查看详情   
评分人:【 bat-zw 分数: +4  时间:2008-4-2 18:57


2008-4-2 18:39
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 6 楼』:  增加通用性:



  Quote:
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
2008-4-2 18:54
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 7 楼』:  


@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




2008-4-2 19:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





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

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 ]



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

永远的学习者


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



  Quote:
Originally posted by zh159 at 2008-4-2 19:49:
[code]@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
2008-4-2 20:43
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


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



  Quote:
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
2008-4-2 20:47
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


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

@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
2008-4-2 23:53
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-4-2 20:43:

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

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

  Quote:
开始时间:22:47:10.00
结束时间:22:47:12.95
需时:2.95秒

你11楼代码测试:

  Quote:
开始时间:22:52:40.00
结束时间:22:52:43.48
需时:3.48秒

我7 楼的代码测试

  Quote:
开始时间:22:47:20.00
结束时间:22:47:20.03
需时:0.03秒

测试方式:

  Quote:
@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





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

永远的学习者


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



  Quote:
Originally posted by zh159 at 2008-4-3 00:10:


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

你11楼代码测试:

我7 楼的代码测试


测试方式:

是findstr的问题吗?



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





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

就效率方面  应该是zh159兄的更胜一筹



简单!简单!再简单!
2008-4-3 02:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jvive
初级用户

替身



积分 122
发帖 17
注册 2008-3-27
状态 离线
『第 15 楼』:  

本人测试过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 ]



进入网盘(各种工具)
2008-4-3 10:22
查看资料  发短消息 网志  OICQ (275928264)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: