我一直在使用此答案中的代碼來檢查 MS Teams 班級花名冊的添加/更改:
$set = [System.Collections.Generic.HashSet[string]]::new(
[string[]] (Import-CSV -Path stundent.csv).UserPrincipalName,
[System.StringComparer]::InvariantCultureIgnoreCase
)
Import-Csv ad.csv | Where-Object { $set.Add($_.UserPrincipalName) } |
Export-Csv path\to\output.csv -NoTypeInformation
理想情況下,我希望能夠檢查與新檔案相比是否有洗掉,交換匯入檔案位置,并檢查是否有添加。如果我的檔案看起來像 Source1 和 Source2(如下),洗掉檢查將回傳 Export1,添加檢查將回傳 Export2。由于多個班級會有多個學生實體,我想在過濾器查詢中包含 TeamDesc 以確保只回傳該班級學生的特定實體。
Source1.csv
| 團隊描述 | 用戶主體名稱 | 姓名 |
|---|---|---|
| 團隊 1 | [email protected] | 約翰·史密斯 |
| 團隊 1 | [email protected] | 南希畫 |
| 團隊 2 | [email protected] | 哈維登特 |
| 第 3 隊 | [email protected] | 約翰·史密斯 |
Source2.csv
| 團隊描述 | 用戶主體名稱 | 姓名 |
|---|---|---|
| 團隊 1 | [email protected] | 南希畫 |
| 團隊 2 | [email protected] | 哈維登特 |
| 團隊 2 | [email protected] | 蒂姆·塔姆斯 |
| 第 3 隊 | [email protected] | 約翰·史密斯 |
匯出 1.csv
| 團隊描述 | 用戶主體名稱 | 姓名 |
|---|---|---|
| 團隊 1 | [email protected] | 約翰·史密斯 |
匯出2.csv
| 團隊描述 | 用戶主體名稱 | 姓名 |
|---|---|---|
| 團隊 2 | [email protected] | 蒂姆·塔姆斯 |
uj5u.com熱心網友回復:
嘗試以下,它用于Compare-Object通過兩個欄位比較 CSV 檔案,只需將感興趣的屬性傳遞給-Property;結果輸出被分成兩個集合,基于輸入端不同的屬性組合是唯一的,使用內部.Where()方法:
$removed, $added = (
Compare-Object (Import-Csv Source1.csv) (Import-Csv Source2.csv) -PassThru `
-Property TeamDesc, UserPrincipalName
).Where({ $_.SideIndicator -eq '=>'}, 'Split')
$removed |
Select-Object -ExcludeProperty SideIndicator |
Export-Csv -NoTypeInformation Export1.csv
$added |
Select-Object -ExcludeProperty SideIndicator |
Export-Csv -NoTypeInformation Export2.csv
uj5u.com熱心網友回復:
假設兩個 Csvs 都存盤在記憶體中,Source1.csvis$csv1和Source2.csvis $csv2,你已經有了Export2.csv使用的邏輯HashSet<T>:
$set = [System.Collections.Generic.HashSet[string]]::new(
[string[]] $csv1.UserPrincipalName,
[System.StringComparer]::InvariantCultureIgnoreCase
)
$csv2 | Where-Object { $set.Add($_.UserPrincipalName) }
輸出:
TeamDesc UserPrincipalName Name
-------- ----------------- ----
Team 2 [email protected] tim tams
對于第一個要求,Export1.csv參考物件將是并且您可以使用哈希表$csv2代替 a ,在這種情況下非常容易:HashSet<T>Group-Object -AsHashTable
$map = $csv2 | Group-Object UserPrincipalName -AsHashTable -AsString
# if Csv2 has unique values for `UserPrincipalName`
$csv1 | Where-Object { $map[$_.UserPrincipalName].TeamDesc -ne $_.TeamDesc }
# if Csv2 has duplicated values for `UserPrincipalName`
$csv1 | Where-Object { $_.TeamDesc -notin $map[$_.UserPrincipalName].TeamDesc }
輸出:
TeamDesc UserPrincipalName Name
-------- ----------------- ----
Team 1 [email protected] john smith
uj5u.com熱心網友回復:
使用此Join-Object script/ Join-Object Module(另請參閱:如何比較兩個 CSV 檔案并輸出僅在其中一個檔案中但不在兩個檔案中的行以及在 Powershell 中,將兩個表合并為一個表的最佳方法是什么?):
加載示例資料:(
在您的情況下,您可能想使用它Import-Csv來匯入資料)
Install-Script -Name Read-HtmlTable
$Csv1 = Read-HtmlTable https://stackoverflow.com/q/74452725 -Table 0 # Import-Csv .\Source1.csv
$Csv2 = Read-HtmlTable https://stackoverflow.com/q/74452725 -Table 1 # Import-Csv .\Source2.csv
Install-Module -Name JoinModule
$Csv1 |OuterJoin $Csv2 -On TeamDesc, UserPrincipalName -Name Out,In
TeamDesc UserPrincipalName OutName InName
-------- ----------------- ------- ------
Team 1 student1@domain.com john smith
Team 2 student4@domain.com tim tams
您可以按原樣使用(單個)結果檔案。如果您真的想使用兩個不同的檔案,您可以將結果拆分為mklement0的漂亮答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/534697.html
標籤:电源外壳格式文件和解
上一篇:串列框專案到Word表
