将CSV文件列导出到其他CSV文件

时间:2020-01-30 10:30:04

标签: powershell csv

我有一个.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,但没有进行“选择”。

1 个答案:

答案 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中的分隔符不是管道符号|,请在代码中进行更改

相关问题