PowerShell CSV文件转换的错误的电脑用不同的日期格式的输入文件

0

的问题

我使用,使用一个脚本的转换。CSV原始数据文件,为更易于管理的数据格式与独立的柱,一个更清洁的图等等。 而由于源文件与原始数据是在我们的日期和时间格式(例如11/23/21,1:00),然后如果电脑是在同我们的格式转换过程的运行完全作为应用0错误。 但是,如果电脑是不同国家的日期和时间格式,然后PowerShell示出了差错在红在这一进程。

当电脑中的其他DateTime格式,我看到的主要错误是:

"分析"与"1"的说法(s):"String是不被承认为一个有效日期时间。"

问题是电脑在那里这会被用于不是在我们的格式(仅改变了我们的格式进行测试),使可能有人在这里,请帮助我要添加到转换过程中的语法或刑/s简单地指定直接在代码的固定格式保持一个静态的输出格式独立的关于电脑时钟的日期和时间格式,如果一项投入文件"11/23/21,1:00"然后指定的代码你想输出格式"dd-嗯-yyyy hh:mm" 有一个结果,如"23-Nov-2021 01:00"

代码部分中的脚本用于转换为:

…
$data = $csvData | ? {$_ -match "\(DTRE"}

dtreFileData = New-Object System.Collections.Generic.List[PSCustomObject]

foreach ($item in $data)
{
  $null = $item.Strategy -match "\(DTRE\|(.*)\)"
  $v = $Matches[1] -split '\|'

  $resultvalue = $v[0] | Convert-CurrencyStringToDecimal
  $expectedvalue = $v[1] | Convert-CurrencyStringToDecimal

  $dtreData = [PSCustomObject]@{
    'DateTime' = ([datetime]::Parse($item.'Date/Time'))
    'ResultValue' = [decimal]$resultvalue
    'ExpectedValue' = [decimal]$expectedvalue
    }
  
  $null = $dtreFileData.Add($dtreData)
  $null = $dtreAllData.Add($dtreData)
}

$dtreFileData | Export-Csv -Path (Join-Path (Split-Path -Path $f -Parent) ($outFile + '.csv')) -Force -NoTypeInformation -Encoding ASCII
…

例的原始来源数据(在CVS文件是几十种线喜欢下一个):

...(DTRE|49.0|48.2);...;11/23/21, 12:58 下午...;

...(DTRE|52.1|52.0);...;11/23/21, 1:00 下午...;

...

...

和输出这样的:

enter image description here

我试着用DateTime例子在其他员额从这里(stackoverflow.com)调整的代码工作一个电脑没有我们的日期和时间格式,并获得DateTime格式的结果以上所述。 例如:

'DateTime' = ([datetime]::Parse($item.'yyyy-MM-dd:HH:mm:ss'))

'DateTime' = ([datetime]::ParseExact($item.'yyyy-MM-dd:HH:mm:ss'))

…
$culture = [Globalization.CultureInfo]::InvariantCulture
…
  'DateTime' = ([datetime]::ParseExact($item.'yyyy-MM-dd:HH:mm:ss', $culture))
…

但是,与这些实例PowerShell显示了错误"不能约束的参数,以参数'InputObject',因为它是null"

更新后的答案,从@塞斯:

在想下一步的修改的代码,用电脑系统中的日期格式中的"24-Nov-21"和其余部分如上:

…
$resultvalue = $v[0] | Convert-CurrencyStringToDecimal
$expectedvalue = $v[1] | Convert-CurrencyStringToDecimal
$cultureInfo= New-Object System.Globalization.CultureInfo("es-ES")

$dtreData = [PSCustomObject]@{
  'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))
  'ResultValue' = [decimal]$resultvalue
  'ExpectedValue' = [decimal]$expectedvalue
…

然后,文件下错误: enter image description here

datetime powershell
2021-11-23 21:14:34
1

最好的答案

1

因为它已说明这是一个很好的想法来解决CSV有一个更好的日期格式. 一个例子是ISO8601这可以使用 Get-Date -Format "o".

这说 ,获得新的 依赖C#东西的背景。 所以你可以用C#码阅读 ,在一个特定的文化. 如你所知来源的文化,这应工作。 固定的时间戳仍然是一个更好的主意。

$cultureInfo= New-Object System.Globalization.CultureInfo("en-US")
$dateString = "11/23/21, 12:58 PM";
$dateTime = [System.DateTime]::Parse($dateString, $cultureInfo);
Get-Date -Format "o" $dateTime

这个例子码你会分配 $dateString$item.' Date/Time' 结果你可能会想要的结果 Get-Date. 所以你会分配 $dtreData.'DateTime' 结果, Get-Date 呼叫。 或者是可能的使用。净DateTime对象直接转换为特定的文化。 例如,通过调用 $dateTime.ToString((New-Object System.Globalization.CultureInfo("en-ES"))). 虽然不是所有用的你也可以通的格式标识到这种方法。 这可能是相关的如果你想要避免创造更多的对象。 一些不必要的呼叫会 $dateTime.ToString("o", (New-Object System.Globalization.CultureInfo("en-ES"))) (如格式o同样在每一个文化)。

2021-12-01 06:41:00

谢谢你响应@Seth但没有解决方案。 我试图修改代码用你的线路,但是我仍然无法得到日期和时间在一格式直接指定的代码,他说:"采取一切DateTime值在CSV输入文件并将它们转换的格式 dd-MMM-yyyy hh:mm或例如为在文化的名字 es-ES或者类似的东西",即被直接指定的代码作为一个普遍/通用的方法,该工作无论如何,如果该电脑是英文的日期和时间格式,或如果电脑是在西班牙的日期和时间格式,或如果电脑是在法国的日期和时间格式
adiario

与您的词,我想下一次的修改的代码,用电脑系统中的日期在我们的格式: $resultvalue = $v[0] | Convert-CurrencyStringToDecimal $expectedvalue = $v[1] | Convert-CurrencyStringToDecimal $cultureInfo= New-Object System.Globalization.CultureInfo("en-US") $dtreData = [PSCustomObject]@{ 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo)) 'ResultValue' = [decimal]$resultvalue 'ExpectedValue' = [decimal]$expectedvalue } 转换工作没有错误,但给予的结果在我们的格式和依赖OS日期格式。
adiario

我也试过的下一个修改的代码,用电脑系统中的日期格式中的"24-Nov-21": …$resultvalue = $v[0] | Convert-CurrencyStringToDecimal $expectedvalue = $v[1] | Convert-CurrencyStringToDecimal $cultureInfo= New-Object System.Globalization.CultureInfo("es-ES") $dtreData = [PSCustomObject]@{ 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo)) 'ResultValue' = [decimal]$resultvalue 'ExpectedValue' = [decimal]$expectedvalue 和这里PowerShell给出了错误的说法:"出口Csv:不能约束的参数,以参数'InputObject',因为它是null"
adiario

关于 Get-Date -Format "o" $dateTime 我真的不知道在那里将其在发布码在这个问题。 我试着把它放在多个地方如在最后一行,或者之后 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))或者进入它,但是PowerShell给的错误。 关于 $dateString = "11/23/21, 12:58 PM"; 我没有使用这部分是因为我看到这将是一个输入的例子,在这种情况下输入日期的价值观已经进入CSV文件,该文件是值需要的工作。
adiario

万一你知道如何@赛斯,你能不能修改的代码贴在上述问题和增加它需要修改有结果我需要的日期和时间。 非常感谢你的时间!
adiario

你是创造一个datetime对象与特定的文化。 你会想你的 $dtreDataGet-Date -Format "o" $dateTime. 一个 Get-Date 使用 $dateTime 作为输入的还应该使用常规的区域设置。 或者你可以明确界定的区域,例如,使用输出 $localDT.ToString((New-Object System.Globalization.CultureInfo("en-ES"))).
Seth

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................