我从来没有真正使用过Powershell,所以我被它困住了。我的目标是将多个CSV合并为一个,目前更具体地说是3个。
使用Import-Csv和Foreach-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
}