[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 编辑 ]
***共同提高***

@echo off
for /f "tokens=1* delims=:" %%i in ('findstr /n .* 1.txt') do (
    echo %%j>>3.txt
    for /f "tokens=1* delims=:" %%a in ('findstr /n .* 2.txt') do (
        if %%i==%%a echo %%b>>3.txt
    )
)   
pasle
1

评分人数

    • batman: 以示鼓励,继续加油。PB + 1

TOP

首先对二楼做为鼓励予以加分,同时对存在的问题予以指出:
二楼的方法存在以下的问题:
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

纠正一点,2楼并没有产生临时文件,他只是输出到文件,不算违规。
此题,说难不难,说简单也不简单,不过以“浅默”的功力似乎不应该只是如此。。。
大家都来试试。。。看谁最先给出完美答案。。







.
技术问题请到论坛发帖求助!

TOP

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

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

TOP

这题应该是1.txt总是比2.txt多吧?
心绪平和,眼藏静谧。

TOP

原帖由 pusofalse 于 2008-7-25 00:01 发表
这题应该是1.txt总是比2.txt多吧?


未必,也有可能是 2.txt 比 1.txt 的行数多。
技术问题请到论坛发帖求助!

TOP

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

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

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

TOP

这类的交错输出的文本题比较经典,不确定到底那个多,岂不是要先得读出行数多或行数少的那个?
心绪平和,眼藏静谧。

TOP

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

TOP

也可以根本不必要判断文本的行数。
技术问题请到论坛发帖求助!

TOP

的确如此 思维定向了。
心绪平和,眼藏静谧。

TOP

不过有个疑问就是:效率是不是会非常低呢?特别是遭遇大文件时
根据代码的意思,似乎是查询两个文件行号一样的时候就分别写入到文件里

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

TOP

想得头都要破了

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type 11.txt') do (
  4.    set /a m+=1
  5.    set "home!m!=%%a"
  6. )
  7. for /f "delims=" %%b in ('type 12.txt') do (
  8.    set /a n+=1
  9.    set "bat!n!=%%b"
  10. )
  11. if %m% gtr %n% (
  12.    for /l %%c in (1 1 %m%) do (
  13.       if not "!home%%c!"=="" echo !home%%c!
  14.       if not "!bat%%c!"=="" echo !bat%%c!
  15.    )
  16. ) else (
  17.    for /l %%d in (1 1 %n%) do (
  18.       if not "!home%%d!"=="" echo !home%%d!
  19.       if not "!bat%%d!"=="" echo !bat%%d!
  20.    )
  21. )
  22. pause
复制代码

[ 本帖最后由 more 于 2008-7-25 10:44 编辑 ]
2

评分人数

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

返回列表