Jsem pomocí PowerShell skript převést .CSV raw datový soubor do více zvládnutelné formátu dat s samostatných sloupcích, čistší zobrazení atd. A protože zdrojový soubor s raw dat je v NÁS formát data a času (např. 11/23/21, 1:00 PM), pak pokud je PC ve stejném formátu US procesu konverze běží perfektně, jako by se s 0 chyb. ALE pokud je PC v jiné zemi, formát data a času, pak PowerShell ukazuje chyby v červené v procesu.
Když je PC v jiné formát DateTime vidím, že hlavní chyba je:
"Parse" s "1" argument(y): "Řetězec nebyl rozpoznán jako platný DateTime."
A problém je v PC, kde to bude použito, je v NÁS není formát (pouze se změnil na NÁS formát pro testování), tak může tady někdo prosím, pomozte mi, jak přidat do procesu konverze syntaxe nebo větu/y, aby jednoduše zadat přímo v kódu, pevný formát, který udržuje statickou výstupní formát nezávisle o PC hodiny formát data a času, a pokud jeden ze vstupů do souboru je "11/23/21, 1:00 HODIN" pak specifikovat v kódu, chcete výstup ve formátu "dd-MMM-rrrr hh:mm" , aby se výsledek jako "23-Nov-2021 01:00 PM"
Části kódu ve skriptu použit pro převod je:
…
$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
…
Příklad surového zdroj dat (v CVS souboru jsou desítky linek, jako další):
...(DTRE|49.0|48.2);...;11/23/21, 12:58 PM...;
...(DTRE|52.1|52.0);...;11/23/21, 1:00 PM...;
...
...
A Výstup vypadá takto:
Snažil jsem se s DateTime příklady v jiných příspěvků zde (stackoverflow.com) pro nastavení kódu pro práci v PC bez NÁS formát data a času a ten formát DateTime výsledkem je popsáno výše. Příklady, jako:
'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))
…
Ale s těmito příklady PowerShell zobrazí chyba "Nelze vytvořit vazbu argument pro parametr 'InputObject, protože je null"
Aktualizace po odpovědi od @Seth:
Když se snaží další modifikace kódu, s PC systému formát data v "24-Nov-21" a opouštět zbytek jako výše:
…
$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
…
dd-MMM-yyyy hh:mm
, nebo například ke kultuře názeves-ES
nebo něco podobného", tj. být zadán přímo v kódu jako univerzální/obecný způsob, kde to funguje bez ohledu na to jestli je PC v angličtině formát data a času, nebo pokud je PC ve španělštině formát data a času, nebo pokud je PC ve francouzštině formát data a času