Nor*_*ros 4 windows csv powershell
我从来没有真正使用过 Powershell,所以我对此很困惑。我的目标是将多个 CSV 合并为 1 个,更具体地说,目前为 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... } }
Run Code Online (Sandbox Code Playgroud)
我基本上需要做的是将 CVS3 中的“名称”与 CSV1 中的“名称”以及需要的其他字段进行匹配,然后对 CSV2 执行相同操作并输出到最终文件。
似乎使用Where-ObjectFast时$_是空的(?)。
请告诉我我在这里做错了什么,我将非常感激。
您遇到的问题不是ForEach-Object绑定和处理输入的开销 - 因此替换ForEach-Object为ForEach-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)
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |