【问题标题】:Converting CSV date string to another format将 CSV 日期字符串转换为另一种格式
【发布时间】:2017-06-01 12:47:45
【问题描述】:

我得到了一个包含日期列的 CSV 文件,格式为 dd/MM/YYY HH:mm:ss,例如14/11/2016 00:00:00.

我正在尝试将该列的格式批量转换为 ISO-8601 日期格式:YYYY-mm-dd HH:mm:ss

我试过了:(我已经编辑过输入字符串格式有错误...)

Import-Csv someCSV.csv | % {
  $_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss").ToString('yyyy-MM-dd HH:mm:ss'))
} | Export-Csv 'C:\testBis.csv' -NoTypeInformation

我收到一个错误:

找不到“ParseExact”的重载和参数计数:“2”。
在行:1 字符:69
+ ... 日期]' ; ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYY HH ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

我已经看过并尝试了尝试解析并切断一些想法,但没有任何接缝可以工作。

我不知道我做错了什么。有什么建议吗?

【问题讨论】:

  • ParseExact 需要三个参数
  • ..为什么人们实际上无法阅读错误消息,这是怎么回事?

标签: powershell csv


【解决方案1】:

匹配年份的pattern必须是yyyy(带小写y),您的采样日期中没有逗号,您需要提供ParseExact()的文化信息。我还建议转义正斜杠,否则它们将匹配计算机区域设置中配置的任何日期分隔符。并且您需要将修改后的记录回显到管道中,否则将无法导出任何内容。

$culture = [Globalization.CultureInfo]::InvariantCulture
Import-Csv someCSV.csv | ForEach-Object {
    $_.'[Date]' = [DateTime]::ParseExact($_.'[Date]', 'dd\/MM\/yyyy HH:mm:ss', $culture).ToString('yyyy-MM-dd HH:mm:ss')
    $_    # <-- feed modified record back into pipeline
} | Export-Csv 'C:\testBis.csv' -NoType

【讨论】:

  • 文化不需要作为 ParseExact 函数的参数吗?
  • @maco1717 确实会。固定。
【解决方案2】:

DateTime.ParseExact 至少需要三个参数。第三个参数是要使用的文化。可以传递不变的文化[System.Globalization.CultureInfo]::InvariantCulture,例如:

([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture)

或更简洁的版本:

$inv = [System.Globalization.CultureInfo]::InvariantCulture
$fmtFrom = "dd/MM/YYY HH:mm:ss"
$fmtTo   = "yyyy-MM-dd HH:mm:ss"

Import-Csv someCSV.csv | % {
    $_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),$fmtFrom, $inv).ToString($fmtTo))
  } | Export-Csv 'C:\testBis.csv' -NoTypeInformation

我从格式字符串中删除了,,因为您提到实际格式是dd/MM/YYY HH:mm:ss,而不是dd/MM/YYY, HH:mm:ss

【讨论】:

  • 这行不通。您的输入格式字符串仍然无效,并且不会创建输出,因为您没有将修改后的记录反馈回管道。
猜你喜欢
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多