[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-001】批处理实现两文本同行交替输出


从今天开始,本人将陆续推出文本输出类题目给新手做,并会根据解答思路和解答过程酌情
加分(解题思路为重),希望广大新手放开思路踊跃讨论和解题,本人也会在其中发表自己的
观点,并予以新人以指点的,好了不多说了,下面是第一题:


有两个文本如下(实际中并不知道两文本各有多少行):
文本1.txt
  1. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  2. ccccccccccccccccccccccccccccccccccccccc
  3. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  4. ggggggggggggggggggggggggggggggggggggggg
  5. wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
  6. zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
复制代码
文本2.txt
  1. hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
  2. iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
  3. jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
  4. nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
复制代码
要求用批处理输出如下(两文本交替输出):
  1. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  2. hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
  3. ccccccccccccccccccccccccccccccccccccccc
  4. iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
  5. eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  6. jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
  7. ggggggggggggggggggggggggggggggggggggggg
  8. nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
  9. wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
  10. zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
复制代码
要求:
1 尽量不生成临时文件
2 代码要高效
3 代码尽量简洁
目的:
唯一的目的在于共同提高!
----------------------------------------------------------------------------------------------------------------------------------------------------
到目前为止,已经有了两个较为满意的答案:
第一种是先判断行数采用变量赋值的方法,见14楼more和15楼本人的代码。
特点:通用性强,代码简洁且效率较高。
第二种是不判断行数采用变量控制的方法,见16楼pusofalse版主和18楼本人的代码。
特点:通用性强,代码简洁且效率最高。

第三种是生成临时文件的方案,见24楼本人的代码。
特点:思路较独特
希望大家充分放开思路,看看还有别的解决方案不,只要是按要求做出来的,一律加分。



[ 本帖最后由 batman 于 2008-7-27 23:58 编辑 ]
***共同提高***

首先对二楼做为鼓励予以加分,同时对存在的问题予以指出:
二楼的方法存在以下的问题:
1 首先我们不知道两个文本各有多少行,如果1.txt的行数比2.txt少,而你的代码中for循环到
了1.txt最后一行就终止了,那么2.txt多出的行就全部漏掉了。
2 如果1.txt中的行数比2.txt少,二楼的代码也存在效率问题,在上面的代码中调用for的次数
是1.txt行数乘上2.txt的行数,而理论上最少的调用次数是两文本行数的和。
3 if %%i==%%a改为if "%%i"=="%%a"实为妥当些。
4 最后的pause出现了笔误。

[ 本帖最后由 batman 于 2008-7-24 15:25 编辑 ]
***共同提高***

TOP

原帖由 随风 于 2008-7-24 13:38 发表
纠正一点,2楼并没有产生临时文件,他只是输出到文件,不算违规。

对不起,是我搞错了,已更正。
***共同提高***

TOP

给个小提示:
可以先判断两个文本哪个的行数多,再把行多的文本放到第一个for中。

同时也可以不判断文本的行数,但思路就要开放点了。

本人暂时想出了三个解决方案,暂不贴出,希望大家能有更好的办法。
***共同提高***

TOP

是不是可以换个思路:判断和输出同时进行呢?
***共同提高***

TOP

原帖由 more 于 2008-7-25 10:38 发表
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('type 11.txt') do (
   set /a m+=1
   set "home!m!=%%a"
)
for /f "delims=" %%b in ('type 12.txt') do (
   set /a n+=1
   set  ...

代码可以简化,下面先公布我的第一种方法:
  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do set /a n+=1&call,set "_%%n%%=%%i"
  3. for /f "delims=" %%i in (2.txt) do set /a m+=1&call,set ".%%m%%=%%i"
  4. if %n% gtr %m% (set "num=%n%") else (set "num=%m%")
  5. for /l %%i in (1,1,%num%) do (
  6.      if defined _%%i call,echo %%_%%i%%
  7.      if defined .%%i call,echo %%.%%i%%
  8. )
  9. pause>nul
复制代码

[ 本帖最后由 batman 于 2008-7-25 17:05 编辑 ]
***共同提高***

TOP

原帖由 youxi01 于 2008-7-25 08:23 发表
不过有个疑问就是:效率是不是会非常低呢?特别是遭遇大文件时
根据代码的意思,似乎是查询两个文件行号一样的时候就分别写入到文件里

这样的话,要是第二个文件有1W行岂不是要比对1W次?这样,明显有9999次是没 ...

我想在这里应该不有去考虑极端情况,比如特殊字符处理什么的。
***共同提高***

TOP

既然这种最高效的方法也出来了(只可惜是版主级做出来的),下面就贴出本人的第二种方法:
  1. @echo off
  2. set "n=-1"&set "flag=a"
  3. :begin
  4. set /a n+=1
  5. if %n% equ 0 (set "m=") else (set "m=skip=%n%")
  6. for /f "%m% delims=" %%i in (1.txt) do echo %%i&if defined flag goto next
  7. set no=a
  8. :next
  9. for /f "%m% delims=" %%i in (2.txt) do echo %%i&goto begin
  10. if not defined no set "flag="&goto begin
  11. pause>nul
复制代码
***共同提高***

TOP

再次提示:
第三种方法可就本题而言来解(不考虑行数太多的情况)
***共同提高***

TOP

最后给出本人的第三个方案,生成临时文件且通用性不很强,
解题思路和上面的完思路不同:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "num=0"
  3. for %%a in (1.txt 2.txt) do (
  4.     for /f "delims=" %%i in (%%a) do (
  5.         set /a n+=1
  6.         if !n! gtr !num! set "num=!n!"
  7.         set /p=%%i <nul>>temp.txt
  8.     )
  9.     echo.>>temp.txt&set "n=0"
  10. )
  11. :lp
  12. set /a n+=1
  13. for /f "tokens=%n%" %%i in (temp.txt) do echo %%i
  14. if %n% neq %num% goto lp
  15. del /q temp.txt&pause>nul
复制代码
***共同提高***

TOP

呵呵,本人最老的一道题也被你们翻出来了,加油,有这股劲就对了!
***共同提高***

TOP

返回列表