|
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 |
|
|
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 |
|
|
Climbing
铂金会员
网络独行侠
积分 6962
发帖 2753
注册 2003-4-16 来自 河北保定
状态 离线
|
『第
3 楼』:
试试ruby吧,应该是很简单的事儿。
|
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
|
|
2008-4-2 17:20 |
|
|
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 |
|
|
huahua0919
银牌会员
积分 1608
发帖 780
注册 2007-10-7
状态 离线
|
『第
5 楼』:
!a:~2,50!
这样做是不是通用性就降低了
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|