从CSV转换日期不起作用

时间:2014-10-29 17:03:10

标签: powershell powershell-v3.0

我尝试从我的csv文件转换日期,但是遇到错误:无法将null转换为'System.DateTime'类型。

重现错误的示例:

$some_string = "(PDH-CSV 4.0) (E. South America Daylight Time)(120),\\NA\Process(w3wp_10060)\% Processor Time,\\NA\Process(w3wp_10060)\% User Time,\\NA\Process(w3wp_10060)\% Privileged Time,\\NA\Process(w3wp_10060)\Page Faults/sec,\\NA\Process(w3wp_10060)\Working Set,\\NA\Process(w3wp_10060)\Private Bytes,\\NA\Process(w3wp_10060)\Thread Count,\\NA\Process(w3wp_10060)\Handle Count`n" +
"10/29/2014 09:37:41.056, , , , ,55205888,44847104,26,471`n" +
"10/29/2014 09:37:46.931,0,0,0,0.17039241953890988,55209984,44847104,26,471`n" +
"10/29/2014 09:37:52.806,0,0,0,0,55209984,44847104,26,471`n"

$datasource = $some_string | ConvertFrom-Csv -Delim ','

foreach ($datapoint in $datasource) 
{
    $date = [DateTime]$datapoint.$StrData
    Write-Host $date
}

[编辑]

这种方式有效:

$date = [DateTime]$datapoint.'(PDH-CSV 4.0) (E. South America Daylight Time)(120)'

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

根本原因是没有使用Set-PSDebug -StrictSet-Strictmode -version latest。严格模式有几个sanity checks

  • 禁止引用未初始化的变量(包括 字符串中未初始化的变量。)。
  • 禁止引用对象的不存在的属性。
  • 禁止使用调用方法语法的函数调用。
  • 禁止没有名称的变量($ {})。

在严格模式下,你会得到像

这样的合理错误
The variable '$StrData' cannot be retrieved because it has not been set.
The variable '$date' cannot be retrieved because it has not been set.

而不是混淆

Cannot convert null to type "System.DateTime".

在指定严格模式后,很容易注意到$StrData变量未初始化,因此尝试$datapoint的不存在的成员是徒劳的。

答案 1 :(得分:0)

CB有一个未解答的问题,他在询问$StrData是如何填充的。你仍然没有明确地解决这个问题,但在编辑中你有这个:

$date = [DateTime]$datapoint.'(PDH-CSV 4.0) (E. South America Daylight Time)(120)'

这表明您希望$strData成为第一列的列标题。我将假设这可能会发生变化,并且静态分配值并不是您想要的。在这种情况下,您可以执行的操作是获取第一列名称并将其分配给$strData,这将使脚本的其余部分工作。

$strdata = $datasource | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name -First 1 

使用Get-Member我们得到代表csv标头的note属性。展开第一个返回的名称(PDH-CSV 4.0)(E。南美夏令时)(120)'。这会变成一个变量。可以在定义$datasource之后放置代码。如果这不是您的意图,请更新您的帖子,了解有关$strData

的更多信息