|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 16 楼』:
使用 LLM 解释/回答一下
Originally posted by terse at 2008-4-1 16:35:
我来一个 虽然多一FOR 但有效 怎么多个%%I
@echo off
for /f "delims=" %%i in (a.txt) do >>c.txt echo %%i&call :loop
for /f "delims=" %%i in (b.txt) do i ...
学习!!!!!!!!!!
|

批处理之家新域名:www.bathome.net |
|
2008-4-1 20:38 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 17 楼』:
使用 LLM 解释/回答一下
@echo off
for /f "delims=" %%i in (a.txt) do >>c.txt echo %%i&call :loop
for /f "delims=" %%i in (b.txt) do if not defined %%i echo %%i>>c.txt
pause
goto :eof
:loop
for /f "delims=" %%i in (b.txt) do if not defined %%i set %%i=A &>>c.txt echo %%i&goto :eof
不好意思,为了得到提高,本人虽然水平有限,还是试着解释这段代码如下:
第一个for循环表示从a.txt中依次读取每行,每读取一行就把这行添加输入到c.txt中然后跳转到第二个for循环中;
第二个for循环的意思是依次读取b.txt中每一行,每读一行就把存在于循环中%%i变量(第二个for循环的%%i),在b.txt中这行中查找一次,如果没发现就把这一行改变变量名为A并添加输入到c.txt中,然后结束再开始第一个for循环,这样后面的每次循环就不会查找这一行了(其变量名为A而不是%%i);
而当第一个大循环也就是第一和第二个for循环结束后,便开始了第三个for语句的循环,在这个for循环中就是一行行地对b.txt查找在当前循环中是否有变量%%i(同样行,其余的行的变量名都变成A了)的存在,如没有就添加输入到c.txt中。
真的好难解释啊!!!!!!!!!!!!
总结:trse巧妙的将三个for循环中的变量都命名为%%i,同时反复运用 if (not) defined语句进行查找识别,成功的实现了对a.txt和b.txt跳行并不丢失行的输出,实在是高,佩服!!!
|

批处理之家新域名:www.bathome.net |
|
2008-4-1 21:37 |
|
|
26933062
银牌会员
    
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
『第 18 楼』:
使用 LLM 解释/回答一下
原来是在不知道哪个文件行数多的情况下
如此把2楼代码稍作修改即可达到楼主的要求
:
@echo off&cd.>c.txt
set max=-1
for /f "delims=" %%a in (1.txt) do (
>>c.txt echo %%a&set /a max+=1
call :loop %%max%%
)
set /a max+=1
set flag=a
:loop
if %max% equ 0 (set skip=) else set "skip=skip=%max%"
for /f "%skip% delims=" %%i in (2.txt) do (
>>c.txt echo %%i
if not defined flag goto :eof
)
if not defined flag (goto :eof) else start c.txt&exit
另外: 2 楼的第一个代码到底哪里不行?怎么不通用?
Last edited by 26933062 on 2008-4-1 at 09:43 PM ]
|

致精致简! |
|
2008-4-1 21:40 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 19 楼』:
感谢兄弟对本贴的多次关注:
使用 LLM 解释/回答一下
Originally posted by 26933062 at 2008-4-1 21:40:
原来是在不知道哪个文件行数多的情况下
如此把2楼代码稍作修改即可达到楼主的要求
:
@echo off&cd.>c.txt
set max=-1
for /f "delims=" %%a i ...
但你的代码还是有问题,你可测试下看。
|

批处理之家新域名:www.bathome.net |
|
2008-4-1 21:46 |
|
|
26933062
银牌会员
    
积分 2268
发帖 879
注册 2006-12-19
状态 离线
|
|
2008-4-1 21:51 |
|
|
balinger
中级用户
  
积分 356
发帖 115
注册 2004-7-27
状态 离线
|
『第 21 楼』:
使用 LLM 解释/回答一下
14楼的思路的确奇妙,令人佩服!
不过还有个小问题,如果 b.txt 中有相同的行,就会出错。
|
|
2008-4-1 21:58 |
|
|
topmcs
初级用户
 
积分 25
发帖 16
注册 2008-4-1 来自 湖南
状态 离线
|
|
2008-4-2 11:58 |
|
|
terse
银牌会员
    
积分 2404
发帖 946
注册 2005-9-8
状态 离线
|
   『第 23 楼』:
使用 LLM 解释/回答一下
Originally posted by balinger at 2008-4-1 21:58:
14楼的思路的确奇妙,令人佩服!
不过还有个小问题,如果 b.txt 中有相同的行,就会出错。
确实如此 改这样
@echo off
for /f "delims=" %%i in (a.txt) do echo %%i&call :loop
for /f "%n% delims=" %%i in (b.txt) do echo %%i
pause
goto :eof
:loop
for /f "%n% tokens=1* delims=:" %%i in ('findstr /n .* "b.txt"') do set n=skip=%%i &echo %%j&goto :eof
|

简单!简单!再简单! |
|
2008-4-2 12:50 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 24 楼』:
高!!!!!!!!!!!!!
使用 LLM 解释/回答一下
for /f "%n% tokens=1* delims=:" %%i in ('findstr /n .* "b.txt"') do set n=skip=%%i &echo %%j&goto :eof
使用"delims=:" "findstr /n" "%%n=skip=%%i" 把%%i变量变为行号,思路的确是太广了。
Last edited by zw19750516 on 2008-4-2 at 01:55 PM ]
|

批处理之家新域名:www.bathome.net |
|
2008-4-2 13:51 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 25 楼』:
基本在一个大循环解决问题的方案:
使用 LLM 解释/回答一下
通用范围为1-999行
@echo off
set n=-1
for /f "delims=" %%i in ('findstr /n .* a.txt') do (
set a=%%i
set /a n+=1
set /a v=n+1
setlocal enabledelayedexpansion
set a=!a:*:=!&echo !a!&call :lp
endlocal
)
for /f "skip=%n% delims=" %%i in ('findstr .* b.txt') do echo %%i
pause&goto :eof
:lp
set m=skip=!n!
if "!m!"=="skip=0" set m=
for /f "delims= %m%" %%i in ('findstr /n .* b.txt') do (
set b=%%i
if "!b:~,1!"=="!v!" set b=!b:*:=!&echo !b!&goto :eof
if "!b:~,2!"=="!v!" set b=!b:*:=!&echo !b!&goto :eof
if "!b:~,3!"=="!v!" set b=!b:*:=!&echo !b!&goto :eof
)
Last edited by zw19750516 on 2008-4-2 at 11:47 PM ]
|

批处理之家新域名:www.bathome.net |
|
2008-4-2 21:26 |
|