我需要在以下条件下将CSV格式的三个文本文件合并为一个:
在 pricelist-1.txt 中有一个colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"]
,它指向表 cnet-product-de.txt - 也指向{{1 }}。
在 cnet-product-de.txt 上,ProductID
指向表 cnet-text-de.txt - 指向ProductID
。
现在我想将三个文件和一个脚本组合成一个CSV文件。 最后,ProductID;描述;制造商零件编号;净价; NetRetailPrice + Text应该从cnet-text-en.txt上传。
该脚本有效,但它需要永远(超过8小时)双循环和巨大的txt文件(最多300和#39,000行)。 有谁知道如何加快我的脚本?如果你不明白条件,请不要犹豫,因为我不是母语人士。
MarketingTextID
答案 0 :(得分:1)
如果您需要交叉加入300000行CSV,那么您正在查看内部循环的 300亿次次迭代。即使每个人都在一毫秒之内,你也会看到几个小时:就像你一样。
您需要减少迭代次数。目前你在循环结束时正在进行continue
...而你只查找第一个结果。所以内部循环只获得一个值,因此:
foreach ($ID in $csvtext){ if(($ID.ID -eq $1) -Or ($ID.ID -eq $2) -Or ($ID.ID -eq $3) -Or ($ID.ID -eq $3)) { $temp += $ID1 | select *,@{name="Text";expression={$ID.Text}} break } else { continue } }
可以成为:
$opts = $1, $2, $3, $4;
$innerRes = $csvtext | Where-Object $_.ID -in $opts |
select-object -first 1 |
select-object *,@{name="Text";expression={$_.Text}}
外部循环上的类似转换意味着您可以将管道分配给结果而不是附加到数组(前者比后者更快)。
通常:使用平台的核心范例(在PowerShell:管道中)通常比使用其他线路更好。
最后:可能是您的工具出错的情况:将每个CSV上传到数据库并使用SQL(专为此类操作而设计)但您需要在SQL中使用set操作而不是必要的代码。