[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  把两个文本的相同行交叉合并,需要考虑以下两种情况:
  1、两个文本的行数相同;
  2、两个文本的行数不同。

  如果两个文本行数相同,则可以省略对文本行数的判断,但考虑到效率高低,需要使用临时文件,则可使用如下代码:
  1. @echo off
  2. findstr .* 1.txt>_1.txt
  3. setlocal enabledelayedexpansion
  4. for /f "delims="  %%i in (2.txt) do (
  5.     set /a num+=1
  6.     echo !num!:%%i
  7.     findstr /b /i "!num!:" _1.txt
  8. )
  9. del /q _1.txt
  10. pause
复制代码
  如果两个文本行数不同,则需要判断行数谁多谁少,从而减少对比次数,演示代码如下:
  1. @echo off
  2. :: 生成临时文件,主要是为了获得 行数:行内容 格式的文本
  3. findstr /n .* 1.txt>_1.txt
  4. findstr /n .* 2.txt>_2.txt
  5. :: 获取各自的总行数
  6. for /f "delims=:" %%i in (_1.txt) do set num_1=%%i
  7. for /f "delims=:" %%i in (_2.txt) do set num_2=%%i
  8. :: 比较行数谁多谁少
  9. set num=%num_1%
  10. set file_1=_1.txt&set file_2=_2.txt
  11. if %num_1% geq %num_2% (
  12.     set num=%num_2%
  13.     set file_1=_2.txt&set file_2=_1.txt
  14. )
  15. :: 以行数少的文本为标准,交叉输出两文本的同行内容
  16. for /f "tokens=1* delims=:" %%i in (%file_1%) do (
  17.     echo %%i:%%j
  18.     findstr /b /i "%%i:" %file_2%
  19. )
  20. :: 对多出的行内容,一次性输出,减少了对比次数,从而提高效率
  21. more +%num% %file_2%
  22. del /q _1.txt _2.txt
  23. pause
复制代码
  如果不动用临时文件,要么需要设置大量的变量,严重消耗系统内存;要么需要用 if 语句对行号进行机械对比,严重影响效率;如果使用 set 排序方案,则要求每个文本的总行数不能超过9行,并且不能保证某个文件的行内容总是排在两行中的第一行或第二行。
  注:以上代码都没有考虑特殊字符。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

返回列表