返回列表 发帖

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

本帖最后由 回家路上 于 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多行
::我的两层for循环,需要2分钟,于是去群里寻求好的思路
@echo off
(for /f %%a in (NEW_DG.txt) do (
set e=
for /f "tokens=1,2 delims= " %%i in ($DG.txt) do (
if "%%a" equ "%%i" (echo;%%i %%j&set e=1)
)
if not defined e echo;%%a
))>tmp
pause & exit /bCOPY
::之家群bat-bailong360提供思路,执行需要2秒
@echo off & setlocal enabledelayedexpansion
for /f "tokens=1,2 delims= " %%i in ($DG.txt) do (
set #%%i=%%j
)
(for /f %%a in (NEW_DG.txt) do (
if defined #%%a (echo;%%a      !#%%a!) else echo;%%a
))>tmp
::findstr "DG01801" $DG.txt >nul 2>&1 && echo;存在 || echo;不存在
pause & exit /bCOPY
bat-尘丶的更简短,可以直接输出,如果不在意空格,最好的了
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1,2 delims= " %%a in (1.txt) do set #%%a=%%b
    for /f "delims=" %%b in (2.txt) do echo;%%b        !#%%b!
pause & exit /bCOPY
Batcher出手使用三方gawk,简单有效速度快,2-3秒
gawk "FNR==NR{a[$1]=$2}FNR<NR{print $1,a[$1]}" $DG.txt NEW_DG.txt > 3.txtCOPY
觉得非常好,贴出来有缘人也看看。O(∩_∩)O哈哈~

回复 2# tigerpower


    你帮忙写个更好的gawk吧,求学习。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

也贴一个
@if(0)==(0) echo off
cscript -NoLogo -E:JScript %0 < NEW_DG.txt $DG.txt
pause & exit
@end
var fso = new ActiveXObject("Scripting.FileSystemObject");
var arr1 = WScript.StdIn.Readall().split("\r\n");
var arr2 =  fso.OpenTextFile(WScript.Arguments.Item(0), 1).ReadAll().split("\r\n");
var tem = [],temp = [];
for (var i = 0 ,len = arr2.length ; i < len; i++) {
     var arr = arr2[i].replace(/[\t ]+/," ").split(" ");
     tem[arr[0]] = arr2[i];
};
for (var i = 0, len = arr1.length; i < len; i++) {
     if (tem[arr1[i]]) {
         temp.push(tem[arr1[i]]);
     }
}
WSH.Echo(temp.join("\n"))COPY
1

评分人数

TOP

返回列表