【问题标题】:Export CSV file column to other CSV file将 CSV 文件列导出到其他 CSV 文件
【发布时间】:2023-03-27 21:39:01
【问题描述】:

我有一个 .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,但不是通过“选择”。

【问题讨论】:

  • 你能用python吗?这在 pandas lib 上看起来很容易
  • 我本来希望在 powershell 中执行此操作,但是如果它对您来说更容易并且您有一个想法,请不要犹豫。总之,对于每个序列号,我想知道最近的保修结束日期。谢谢伊万

标签: powershell csv


【解决方案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中的分隔符不是管道符号|,那么在代码中改一下

【讨论】:

  • 幸好有像你这样熟悉powershell的人。它可以工作,但它只显示序列号 9LPYHUJ 而不是 2PONKFL。但是有很好的循环 ForEach-object 我不明白为什么它不扫描文件...
  • @Smarty13 检查输入的 CSV 文件。如果标题周围有空格,您应该删除它们(推荐),或者将它们添加到代码中,如Group-Object 'ServiceTag '
  • @Smarty13 如果我对其进行测试,它会返回您所追求的确切两行。这就是我要求检查 CSV 文件的原因。在您的问题中,您只显示编辑后的输出,而不是真实的输出。你能edit这个问题并把实际的csv内容放在那里吗?
  • 我尝试对您的脚本进行一些更改,并且成功了。我确实有一个带有最近保修到期日期的序列号。非常感谢您的帮助。
  • @Smarty13 不客气!感谢您的反馈。
猜你喜欢
  • 2018-11-29
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多