我有一个.CSV文件,其中包含带有保修开始和结束日期的序列号。 例子:
ServiceTag | StarDate | EndDate
2PONKFL | 2017-09-13 02:00 | 2018-09-14 02:00
2PONKFL | 2017-09-13 02:00 | 2018-09-14 02:00
2PONKFL | 2017-09-13 02:00 | 2023-09-14 02:00
9LPYHUJ | 2012-05-09 02:00 | 2013-05-09 02:00
9LPYHUJ | 2012-05-09 02:00 | 2015-05-09 02:00
9LPYHUJ | 2012-05-09 02:00 | 2018-05-09 02:00
9LPYHUJ | 2012-05-09 02:00 | 2020-05-09 02:00
我想检索一个最新日期为EndDate的序列号,并针对每个服务编号执行此操作,然后将其导出到另一个.CSV文件。
目标是创建另一个.CSV文件,其序列号+每个序列号的最新日期。我希望我对这个问题已经足够清楚了。
我不太擅长Powershell编程,我仍然设法将数据从CSV导出到另一个CSV,但没有进行“选择”。
答案 0 :(得分:1)
使用PowerShell,这并不难做到。
由于日期都是可排序的格式(yyyy-MM-dd HH:mm),因此您甚至不必将这些字符串解析为实际的日期时间对象:
$csv = Import-Csv -Path 'PATH AND FILENAME OF THE CSV' -Delimiter '|'
$result = $csv | Group-Object ServiceTag | ForEach-Object {
$_.Group | Sort-Object -Property EndDate | Select-Object -Last 1
}
# output on screen
$result
# output to new CSV
$result | Export-Csv -Path 'PATH AND FILENAME OF THE NEW CSV' -Delimiter '|' -NoTypeInformation
似乎您的CSV文件的标题和字段周围有多余的空格,这使它更难以使用。
要克服这一点,您可以替换顶行
$csv = Import-Csv -Path 'PATH AND FILENAME OF THE CSV' -Delimiter '|'
使用
$csv = ((Get-Content -Path 'PATH AND FILENAME OF THE CSV') -replace '\s+\|\s+', '|').Trim() |
ConvertFrom-Csv -Delimiter '|'
注意
始终确保您知道分隔符实际上是什么。首先在记事本中打开CSV文件以进行检查。
您可以使用以下方法代替上面的te:
[char]$delimiter = ';' # enter the delimiter character here
$csv = ((Get-Content -Path 'PATH AND FILENAME OF THE CSV') -replace "\s+\$delimiter\s+", $delimiter).Trim() |
ConvertFrom-Csv -Delimiter $delimiter
如果我是您,则使用
将此清理后的内容另存为新的正确CSV文件。$csv | Export-Csv -Path 'PATH AND FILENAME OF THE CSV' -Delimiter '|' -NoTypeInformation
如果CSV中的分隔符不是管道符号|
,请在代码中进行更改