我有一个powershell脚本,它可以从API下载数据并将其导出到.csv文件。我希望能够定期运行它,只下载自上次调用以来更改的内容,并更新现有的.csv文件。
例如:
InitialData.csv
FormID,FormType,LastEditor,Status
F440,Permits,Bill,Opened
F443,Inspeciton,John,Opened
F446,Permits,Clare,Opened
Update.csv
FormID,FormType,LastEditor,Status
F440,Permits,Bill,Closed
F446,Permits,John,Opened
F449,Permits,Bill,Opened
Output.csv
FormID,FormType,LastEditor,Status
F440,Permits,Bill,Closed
F443,Inspeciton,John,Opened
F446,Permits,John,Opened
F449,Permits,Bill,Opened如您所见,已经编辑了2条记录,并在更新中添加了一条记录。
我确信如果我使用数据库服务器,这会更容易,但我的选择仅限于处理powershell和.csv文件。
发布于 2021-03-11 13:22:09
posted解决方案的问题是,它不考虑现有FormID值的其他列中的更改。当存在重复的群对象值时,可以使用FormID选择更新的内容。
$initial = Import-Csv InitialData.csv
$update = Import-Csv Update.csv
$initial+$update | Group-Object FormID |
Foreach-Object {
$_.Group[-1]
} | Export-Csv Output.csv -NoTypeInformation解释:
Group-Object根据提供的属性名称(FormID)对对象进行分组。每个具有匹配属性值的对象被分组到一个GroupInfo对象中。当将这些组传递到Foreach-Object时,$_.Group是包含这些对象的集合。$_.Group[0]将是第一个检查包含匹配的对象。$_.Group[1]将是包含匹配的第二个对象。顺序由输入Group-Object的对象的顺序决定。使用PowerShell的一个巧妙技巧是索引[-1],它始终是集合中的最后一个对象。因此,如果分组只生成一个[0]值或[0]和[1]值,我们总是想要最后一个对象[-1],因为我们在$initial之后检查$update。
发布于 2021-03-10 18:09:36
# What about this ...
$Local:InitalData_Content = Get-Content -Path (Join-Path -Path $PSScriptroot -ChildPath "InitialData.csv") | ConvertFrom-Csv -Delimiter ","
$Local:UpdateData_Content = Get-Content -Path (Join-Path -Path $PSScriptroot -ChildPath "Update.csv") | ConvertFrom-Csv -Delimiter ","
$Local:OutputData_List = New-Object -TypeName System.Collections.ArrayList
# copy all items from $UpdateData_Content to $OutputData_List
$UpdateData_Content | ForEach-Object { [void]$OutputData_List.Add($PSItem) }
# get all items of $InitalData_Content whose FormID not exitits in $UpdateData_Content and add them to $OutputData_List
$InitalData_Content | Where-Object { $PSItem.FormID -notin (@($UpdateData_Content.FormID)) } | ForEach-Object { [void]$OutputData_List.Add($PSItem) }
($OutputData_List | Sort-Object -Property "FormID" | ConvertTo-Csv -Delimiter "," -NoTypeInformation) -replace '"' | Out-File -FilePath (Join-Path -Path $PSScriptroot -ChildPath "Output.csv") -Force发布于 2021-03-11 09:38:16
$InitalData_Content = Import-Csv -Path ./OriginalData.csv
$UpdateData_Content = Import-Csv -Path ./UpdatedData.csv
$OutputData_List = New-Object -TypeName System.Collections.ArrayList
# copy all items from $UpdateData_Content to $OutputData_List
$UpdateData_Content | ForEach-Object { [void]$OutputData_List.Add($PSItem) }
# get all items of $InitalData_Content whose FormID not exitits in $UpdateData_Content and add them to $OutputData_List
$InitalData_Content | Where-Object { $PSItem.FormID -notin (@($UpdateData_Content.FormID)) } | ForEach-Object { [void]$OutputData_List.Add($PSItem) }
$OutputData_List | Export-Csv ./Output.csv -NoTypeInformationhttps://stackoverflow.com/questions/66568284
复制相似问题