Powershell using Foreach-ObjectFast and Where-ObjectFast



我从来没有真正使用过Powershell,所以我被它困住了。我的目标是将多个CSV合并为一个,目前更具体地说是3个。

使用Import-CsvForeach-Object我成功地实现了这一点,然而超级难以置信的慢。我发现了这篇文章,所以我试了一下。难以置信的快速迭代。

不幸的是,我对Powershell太笨了,无法理解为什么我不能正确使用Where-ObjectFast,它不会匹配任何东西。

我的代码示例:
Measure-Command {   $CSV1 = Import-CSV -Path .CSV1.csv }
Measure-Command {   $CSV2 = Import-CSV -Path .CSV2.csv }
Measure-Command {
Import-Csv -Path .CSV3.csv | Foreach-ObjectFast {
$row = $_;
$match = $CSV1 | Where-ObjectFast -FilterScript {       $_.name -eq $row.'name'     }
$dbg1 = 'Matched: {0}' -f $match;   Write-Host $dbg1 -foreground Cyan;
# continued... } }

我需要做的基本上是匹配"name"from CVS3 with "name"然后对CSV2执行相同的操作,并输出到最终文件。

似乎当使用Where-ObjectFast$_是空的(?)。

请告诉我哪里做错了,我将非常感激。

您遇到的问题不是ForEach-Object绑定和处理输入的开销-因此用ForEach-ObjectFast替换ForEach-Object不会产生重大影响。

如果您想在name列(或任何其他列)上进行透视,则使用散列表/字典构建索引表:

$CSV1 = @{}
Import-Csv -Path .CSV1.csv |ForEach-Object { $CSV1[$_.name] = $_ }
$CSV2 = @{}
Import-Csv -Path .CSV2.csv |ForEach-Object { $CSV2[$_.id] = $_ }

现在您不需要等待Where-Object搜索每个集合:

Import-Csv -Path .CSV3.csv |ForEach-Object {
$row = $_
# This is going to be MUCH faster than ... |Where-Object { ... }
$csv1match = $CSV1[$row.name]
$csv2match = $CSV1[$row.id]
# join $row,$csv1match,$csv2match here
}

最新更新