找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27057|回复: 2

[文本处理] 【来自之家群】for循环遍历文本的效率问题

[复制链接]
发表于 2015-8-5 20:19:49 | 显示全部楼层 |阅读模式
本帖最后由 回家路上 于 2015-8-5 20:35 编辑

原帖:http://www.bathome.net/viewthread.php?tid=35952&highlight=
原大概需求概述:
旧文件中中的内容是这样的:
DG00001        10147
DG00002        10148
DG00003        10149
DG00004        10150
DG00005        10151
DG00006        10152
新文件中的内容是这样的:
DG00005
DG00002
DG00003
DG00004
DG00006
DG00001
要把新文件变为
DG00005        10151
DG00002        10148
DG00003        10149
DG00004        10150
DG00006        10152
DG00001        10147
值都是从旧文件中找的,新文件顺序不变,两个文件都5000多行

  1. ::我的两层for循环,需要2分钟,于是去群里寻求好的思路
  2. @echo off
  3. (for /f %%a in (NEW_DG.txt) do (
  4.         set e=
  5.         for /f "tokens=1,2 delims=        " %%i in ($DG.txt) do (
  6.                 if "%%a" equ "%%i" (echo;%%i        %%j&set e=1)
  7.         )
  8.         if not defined e echo;%%a
  9. ))>tmp
  10. pause & exit /b

复制代码
::之家群bat-bailong360提供思路,执行需要2秒

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=        " %%i in ($DG.txt) do (
  3.         set #%%i=%%j
  4. )
  5. (for /f %%a in (NEW_DG.txt) do (
  6.         if defined #%%a (echo;%%a      !#%%a!) else echo;%%a
  7. ))>tmp
  8. ::findstr "DG01801" $DG.txt >nul 2>&1 && echo;存在 || echo;不存在
  9. pause & exit /b

复制代码
bat-尘丶的更简短,可以直接输出,如果不在意空格,最好的了

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims= " %%a in (1.txt) do set #%%a=%%b
  3.     for /f "delims=" %%b in (2.txt) do echo;%%b        !#%%b!
  4. pause & exit /b

复制代码
Batcher出手使用三方gawk,简单有效速度快,2-3秒

  1. gawk "FNR==NR{a[$1]=$2}FNR<NR{print $1,a[$1]}" $DG.txt NEW_DG.txt > 3.txt

复制代码
觉得非常好,贴出来有缘人也看看。O(∩_∩)O哈哈~
发表于 2015-8-5 22:00:49 | 显示全部楼层
回复 2# tigerpower


    你帮忙写个更好的gawk吧,求学习。
发表于 2015-8-5 23:42:52 | 显示全部楼层
也贴一个
  1. @if(0)==(0) echo off

  2. cscript -NoLogo -E:JScript %0 < NEW_DG.txt $DG.txt

  3. pause & exit
  4. @end

  5. var fso = new ActiveXObject("Scripting.FileSystemObject");
  6. var arr1 = WScript.StdIn.Readall().split("\r\n");
  7. var arr2 =  fso.OpenTextFile(WScript.Arguments.Item(0), 1).ReadAll().split("\r\n");
  8. var tem = [],temp = [];

  9. for (var i = 0 ,len = arr2.length ; i < len; i++) {
  10.      var arr = arr2[i].replace(/[\t ]+/," ").split(" ");
  11.      tem[arr[0]] = arr2[i];
  12. };

  13. for (var i = 0, len = arr1.length; i < len; i++) {
  14.      if (tem[arr1[i]]) {
  15.          temp.push(tem[arr1[i]]);
  16.      }
  17. }

  18. WSH.Echo(temp.join("\n"))
复制代码

评分

参与人数 1技术 +1 收起 理由
回家路上 + 1 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 23:27 , Processed in 0.018713 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表