使用 Foreach-ObjectFast 和Where-ObjectFast 的 Powershell

Nor*_*ros 4 windows csv powershell

我从来没有真正使用过 Powershell,所以我对此很困惑。我的目标是将多个 CSV 合并为 1 个,更具体地说,目前为 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... } }
Run Code Online (Sandbox Code Playgroud)

我基本上需要做的是将 CVS3 中的“名称”与 CSV1 中的“名称”以及需要的其他字段进行匹配,然后对 CSV2 执行相同操作并输出到最终文件。

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

请告诉我我在这里做错了什么,我将非常感激。

Mat*_*sen 5

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

如果您想在name列(或任何其他列)上进行旋转,请使用哈希表/字典构建索引表:

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

$CSV2 = @{}
Import-Csv -Path .\CSV2.csv |ForEach-Object { $CSV2[$_.id] = $_ }
Run Code Online (Sandbox Code Playgroud)

现在您无需等待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
}
Run Code Online (Sandbox Code Playgroud)