非常感谢
@kazhafeizhale,你的代码效率提高很多。
我将我的完整需求在下面代码中进行的展示,也待优化。
需求是从fulllist中查找关键字,要求在同一个“订单号”项下查找“商品ID”中同时包含kw01和kw02的用户ID等信息,并生成sublist
基于以下代码也能实现,但是和
@kazhafeizhale优化后后面的代码比,效率太低了。能否优化。
@kazhafeizhale的代码,我还在学习中。请赐教!
以下代码实现基于商品ID关键词实现生成sublist,然后在生成out。
商品ID的ini:
Code: Select all
[kw01]
31710
36711
38711
39711
[kw02]
30710
35710
37710
待优化代码:
Code: Select all
SetBatchLines, -1 ;默认的10ms改为全速运行,cpu使用率会高一些,但是运行时间大约可以缩短一半
T_start:=A_TickCount
; 从fulllist.CSV的同一个“订单号”获取“商品ID”中查找同时包含kw01和kw02的用户ID等信息生成sublist
kw01:="(,31710,|,36711,|,38711,|,39711,)"
kw02:="(,30710,|,35710,|,37710,)"
Array_kw01:=[] , Array_kw02:=[]
fulllist:=A_ScriptDir "\fulllist.csv"
sublist:=A_ScriptDir "\sublist.csv"
SplitPath, fulllist, name, dir, ext, name_no_ext, Drive
Outputfile:=dir "\out.csv"
FileDelete,%outputfile%
FileDelete,%sublist%
FileRead,fulllist0,%fulllist%
ofulllist:=StrSplit(fulllist0,"`n")
; 生成sublist,待优化
for key,Value in ofulllist
{
if (RegExMatch(Value, kw01 ) !=0)
{
Array2:=[]
loop, Parse, Value, CSV
Array2.Push(A_LoopField)
复合ID2:= array2[2] "_" array2[6] "_" array2[7]
Array_kw01.Push(复合ID2)
}
if (RegExMatch(Value, kw02 ) !=0)
{
Array2:=[]
loop, Parse, Value, CSV
Array2.Push(A_LoopField)
复合ID2:= array2[2] "_" array2[6] "_" array2[7]
Array_kw02.Push(复合ID2)
}
}
; 从筛选得到的两个数组中取交集ID
订单列表:=""
for k,v in Array_kw02
{
for m,n in Array_kw01
{
if (v=n)
订单列表.= n "`n"
}
}
Sort,订单列表,U
订单列表:=StrReplace(订单列表,"_","`,")
; 将排序去重后的列表进行写入文件
FileAppend,%订单列表%,%sublist%,utf-8
; ======生成sublist结束===代码待优化===========
hash := {}
for index, element in ofulllist
{
Array6:= StrSplit(element,"`,")
key := Array6[2] Array6[6] Array6[7]
if(hash.HasKey(key))
hash[key].Push(element)
Else
hash[key] := [element]
}
out := ""
loop, Read, %sublist%
{
Array6:= StrSplit(A_LoopReadLine,"`,")
key := Array6[1] Array6[2] Array6[3]
if(hash.HasKey(Key))
{
for k,v in hash[key]
{
out .= v "`n"
}
}
}
FileAppend, %out%,%Outputfile%,utf-8
MsgBox, % A_TickCount-T_start "ms" ;耗时359ms
ExitApp