嘗試匯入具有 ID、開始日期、結束日期列的 CSV,其中每行可以包含相同的 ID 值但不同的日期。
想要對此進行排序,以便找到每個 ID 的最早日期和同一 ID 的最晚結束日期,然后將其寫入 CSV。
輸入csv:
| ID | 開始日期 | 結束日期 |
|---|---|---|
| 100 | 2021 年 4 月 1 日 | 2021 年 5 月 23 日 |
| 100 | 2021 年 6 月 10 日 | 2021 年 12 月 30 日 |
| 200 | 2021 年 8 月 12 日 | 2021 年 9 月 23 日 |
| 200 | 2021 年 12 月 25 日 | 2022 年 5 月 24 日 |
輸出 csv:
| ID | 開始日期 | 結束日期 |
|---|---|---|
| 100 | 2021 年 4 月 1 日 | 2021 年 12 月 30 日 |
| 200 | 2021 年 8 月 12 日 | 2022 年 5 月 24 日 |
我以為我可以匯入 CSV,然后識別 ID,然后為每個 ID 排序開始和結束日期,但似乎無法讓它作業。
到目前為止的代碼:
$source = "C:\test\test.csv"
$outPut = "C:\test\Testsort.csv"
$csv = Import-Csv $source
Foreach ($usr in $csv){
$userID= $usr."ID"
$filtered = $csv | Where-Object {($_.'ID') -eq $userID}
$output = [pscustomobject]@{
'ID' = $userID
'Start Date' =($filtered.'Start Date' | Sort-Object @{Expression=
{[datetime]($_."Start Date")};Descending=$false} | Select -First 1
'End Date' =($filtered.'Start Date' | Sort-Object @{Expression=
{[datetime]($_."End Date")};Descending=$True} | Select -Last 1
}
}
$output | Export-csv $outPut
可悲的是,我正在為每個 ID 的開始和結束日期排序以及為每個 ID 設定最早和最舊的值而苦苦掙扎。
有什么想法嗎?
uj5u.com熱心網友回復:
使用
Group-Objectcmdlet 按共享ID值對行進行分組。對于每組具有相同 ID 的行,找出
Start Date列中最早的日期和列中最新的日期End Date,然后[pscustomobject]將這些值組合起來構建一個輸出。
$source = "C:\test\test.csv"
$output = "C:\test\Testsort.csv"
Import-Csv $source |
Group-Object Id |
ForEach-Object {
$earliestStart = [Linq.Enumerable]::Min([datetime[]] $_.Group.'Start Date')
$latestEnd = [Linq.Enumerable]::Max([datetime[]] $_.Group.'End Date')
[pscustomobject] @{
ID = $_.Name
'Start Date' = $earliestStart.ToString('dd-MMM-yyyy', [cultureinfo]::InvariantCulture)
'End Date' = $latestEnd.ToString('dd-MMM-yyyy', [cultureinfo]::InvariantCulture)
}
} |
Export-csv $output
筆記:
雖然
Sort-Object用于查找最早和最晚日期也是一種選擇,但該[System.Linq.Enumerable]::Min()方法性能更好并且需要更少的記憶體。請注意使用 cast
[datetime[]]將字串從 CSV 輸入轉換為[datetime]實體,以便找到按時間順序排列的最小值/最大值正常作業。在輸出上,最小值。和最大。使用型別的 方法將日期轉換回所需的日期字串格式。
[datetime].ToString()- 注意使用
[cultureinfo]::InvariantCulture以確保使用沒有尾隨的英文月份名稱;默認情況下,使用當前區域性的格式規則,反映在和自動變數.[cultureinfo]::CurrentCulture$PSCulture
- 注意使用
uj5u.com熱心網友回復:
利用組物件和自定義屬性,您可以使用單行代碼來完成:
$source = "C:\test\test.csv"
$outPut = "C:\test\Testsort.csv"
$csv = Import-Csv $source
$csv|group-object id|select name,@{l='start date';e={$_.group|sort "Start Date"|select -expand "Start Date" -first 1 }},@{l='end date';e={$_.group|sort "end Date"|select -expand "end Date" -last 1 }}|Export-csv $outPut
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/348796.html
上一篇:通過cmd或powershell打開資源管理器并選擇一個檔案(具有長檔案路徑)
下一篇:如何向AzureC#SecretClient提供憑據(DefaultAzureCredential)?它似乎忽略憑據和RBAC并拋出403
