中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-07 23:29
48,041 主题排行 / 350,128 发帖 / 今日 3 篇 / 48,252 会员排行
DOS批处理 & 脚本技术(批处理室) » 还是两个文本输出的问题:按列合并两个文本文件
可打印版本  2,354 / 16
第1楼 bat-zw 发表于 2008-04-02 17:12
金牌会员 发帖 1,276 积分 3,105
还是两个文本输出的问题:按列合并两个文本文件
a.txt

b.txt

通过批处理输出内容如下:

要求:
1 不生成任何临时文件
2 尽量简洁代码
3 a.txt和b.txt可互换
4 效率高
===================================
到目前最完美的方案(17楼):


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


[ Last edited by HAT on 2008-10-4 at 13:48 ]
第2楼 bat-zw 发表于 2008-04-02 17:20
金牌会员 发帖 1,276 积分 3,105
没人来试试吗?
我自己来抛砖引玉了,如下:

这个代码最大的问题就是效率的问题。
第3楼 Climbing 发表于 2008-04-02 17:20
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
试试ruby吧,应该是很简单的事儿。
第4楼 bat-zw 发表于 2008-04-02 18:36
金牌会员 发帖 1,276 积分 3,105
简洁2楼代码并提高效率如下:


[ Last edited by zw19750516 on 2008-4-2 at 06:40 PM ]
第5楼 huahua0919 发表于 2008-04-02 18:39
银牌会员 发帖 780 积分 1,608
!a:~2,50!
这样做是不是通用性就降低了
第6楼 bat-zw 发表于 2008-04-02 18:54
金牌会员 发帖 1,276 积分 3,105
增加通用性:
Originally posted by huahua0919 at 2008-4-2 18:39:
!a:~2,50!
这样做是不是通用性就降低了

第7楼 zh159 发表于 2008-04-02 19:49
金牌会员 发帖 1,467 积分 3,687
第8楼 terse 发表于 2008-04-02 20:43
银牌会员 发帖 946 积分 2,404
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楼 bat-zw 发表于 2008-04-02 20:43
金牌会员 发帖 1,276 积分 3,105
Originally posted by zh159 at 2008-4-2 19:49:
第10楼 bat-zw 发表于 2008-04-02 20:47
金牌会员 发帖 1,276 积分 3,105
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 ...

行数不一样,就不存在用这种输出方式了。
第11楼 bat-zw 发表于 2008-04-02 23:53
金牌会员 发帖 1,276 积分 3,105
继续提效:
@echo off
第12楼 zh159 发表于 2008-04-03 00:10
金牌会员 发帖 1,467 积分 3,687
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楼 bat-zw 发表于 2008-04-03 00:31
金牌会员 发帖 1,276 积分 3,105
Originally posted by zh159 at 2008-4-3 00:10:


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

你11楼代码测试:

我7 楼的代码测试


测试方式:

是findstr的问题吗?
第14楼 terse 发表于 2008-04-03 02:18
银牌会员 发帖 946 积分 2,404
就效率方面 应该是zh159兄的更胜一筹
第15楼 jvive 发表于 2008-04-03 10:22
初级用户 发帖 17 积分 122
本人测试过100000次if 否定判断用时1.63秒, 执行效率61349次/秒
call 空语句 10000次 用时10.907秒,执行效率917.496次/秒
findstr .* test.txt>nul 100次 用时3.55秒, 执行效率28.169次/秒

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


附图:


[ Last edited by jvive on 2008-4-13 at 01:02 PM ]
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023