首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用powershell基于密钥更新csv的多列

使用powershell基于密钥更新csv的多列
EN

Stack Overflow用户
提问于 2021-03-10 15:52:35
回答 3查看 319关注 0票数 0

我有一个powershell脚本,它可以从API下载数据并将其导出到.csv文件。我希望能够定期运行它,只下载自上次调用以来更改的内容,并更新现有的.csv文件。

例如:

代码语言:javascript
复制
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文件。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-11 13:22:09

posted解决方案的问题是,它不考虑现有FormID值的其他列中的更改。当存在重复的群对象值时,可以使用FormID选择更新的内容。

代码语言:javascript
复制
$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

票数 0
EN

Stack Overflow用户

发布于 2021-03-10 18:09:36

代码语言:javascript
复制
# 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
票数 0
EN

Stack Overflow用户

发布于 2021-03-11 09:38:16

代码语言:javascript
复制
$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 -NoTypeInformation
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66568284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档