我從來沒有真正使用過 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... } }
我需要做的基本上是將 CVS3 中的“名稱”與 CSV1 中的“名稱”以及其他需要的欄位匹配,然后對 CSV2 執行相同操作并輸出到最終檔案。
似乎在使用Where-ObjectFast 時$_ 為空(?)。
請告知我在這里做錯了什么,我將不勝感激。
uj5u.com熱心網友回復:
您遇到的問題不在于ForEach-Object系結和處理輸入的開銷- 因此替換ForEach-ObjectwithForEach-ObjectFast不會產生重大影響。
如果要對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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329512.html
上一篇:使用沒有負載平衡器的terraform設定虛擬機規模?
下一篇:awk輸出不匹配的行
