powershell - 使用powershell根据键更新csv的多列
问题描述
我有一个 powershell 脚本,它从 API 下载数据并将其导出到 .csv 文件。我希望能够定期运行它,只下载自上次 API 调用以来发生的变化并更新现有的 .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 条记录,并在更新过程中添加了 1 条记录。
如果我使用数据库服务器,我确信这会更容易,但我的选择仅限于使用 powershell 和 .csv 文件。
解决方案
发布的解决方案的问题是它没有考虑现有FormID
值的其他列的更改。当有重复值时,您可以使用Group-Object来选择更新的内容。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]
,因为我们检查$update
after $initial
。
推荐阅读
- forms - 无法设置提交按钮
- spring - HibernateException:使用 DefaultSchemaNameResolver 需要 Dialect 提供正确的 SQL 语句/命令
- php - 存储时关系上的 Laravel 5.0 sync() 不起作用
- python - 如何在 python/selenium 中切换 iframe 工作?
- c - 用于使用指向结构的指针循环结构成员
- php - 每次出现用不同的值替换相同的字符串
- r - 如何停止 ggrepel 标签在 R/ggplot2 中的 gganimate 帧之间移动?
- python - 我在 Python 中遇到了这个错误,EnvironmentNotWritable 错误
- python - 如何在条形图上绘制附加值作为 matplotlib 中的段?
- powershell - 如何在具有其他伴奏(和管理员权限)的 ps1 中启动其他 ps1?