以CSV格式化日期列

时间:2014-11-17 22:10:39

标签: date powershell csv formatdatetime

我正在尝试格式化CSV的第一列中的某些日期。我更愿意使用PowerShell这样的东西,因为我打算自动完成这项任务。有没有人对从MM / DD / YYY到YYYY-MM-DD之类的日期格式改变的最佳方法有任何建议?我尝试过这样的事情:

$date = date -f ('yyyyMMdd')

$HMDA = Import-Csv "C:\HMDA\$date.YieldTableFixed.csv"
   ForEach-Object {
      $HMDA.Date = [datetime]::ParseExact($HMDA.Date).ToString('YYYY-MM-DD')
   } |
   Export-Csv -NoTypeInformation C:\HMDA\test.csv

不幸的是,这似乎没有做任何事情,只是给我一个解析错误,我似乎无法弄清楚为什么会这样。有没有办法可以说:

ForEach-Object{
   $HMDA.A2:$HMDA.A63 = HMDA.$AC.Date.Format('YYYY-MM-DD')
}

2 个答案:

答案 0 :(得分:2)

好的,这里有一些基本错误,但这只是我认为不太了解的问题。现在这很难准确回答,因为你没有给我们一个传入日期字段的例子,所以如果它有一些奇怪的格式,这可能会抛出错误,因为PowerShell无法识别字符串实际上是一个日期。

首先,如果你输入ForEach循环,你用$_引用当前对象。如:

Import-Csv "C:\HMDA\$date.YieldTableFixed.csv" | ForEach-Object {
    $_.Date = get-date $_.Date -f 'yyyy-MM-dd'
} | Export-Csv -NoTypeInformation C:\HMDA\test.csv

最近我从SO上的其他人那里学到的可能是更简单的方法是使用Select,动态创建更新的属性,然后排除原始属性,有效地将其替换为新属性。像这样:

Import-Csv "C:\HMDA\$date.YieldTableFixed.csv" | 
    Select *,@{label = 'Date';expression={get-date $_.Date -f 'yyyy-MM-dd'}} -ExcludeProperty Date | 
    Export-Csv -NoTypeInformation C:\HMDA\test.csv

答案 1 :(得分:0)

ParseExact()需要3个参数:日期字符串,格式字符串和格式提供程序(可能是$null)。此外,您的输出format string不正确(年和日格式说明符必须小写),ForEach-Object从管道读取。

改变这个:

$HMDA = Import-Csv "C:\HMDA\$date.YieldTableFixed.csv"
  ForEach-Object {
    $HMDA.Date = [datetime]::ParseExact($HMDA.Date).ToString('YYYY-MM-DD')
  } |
  Export-Csv -NoTypeInformation C:\HMDA\test.csv

进入这个:

Import-Csv 'C:\HMDA\$date.YieldTableFixed.csv' | ForEach-Object {
  $_.Date = [DateTime]::ParseExact($_.Date, '*M\/dd\/yyyy', $null).ToString('yyyy-MM-dd')
  $_
} | Export-Csv -NoTypeInformation 'C:\HMDA\test.csv'