Używam PowerShell ze scenariuszem do konwersji pliku danych surowych .CSV w bardziej wygodny format danych z osobnymi kolumnami, bardziej czyste występem itp., a ponieważ oryginalny plik z nieprzetworzone dane (w formacie daty i czasu w USA (na przykład, 23.11.2011, 1:00), a następnie, jeśli komputer znajduje się w tym samym formacie USA, proces konwersji odbywa się idealnie, tak jak powinno być, z 0 błędów. ALE jeśli komputer znajduje się w innym formacie daty i czasu w kraju, to PowerShell pokazuje błędy na czerwono w procesie.
Gdy komputer znajduje się w innym formacie daty i czasu, widzę, że podstawowy błąd polega na:
"Analizy" z argumentem(ami) "1": "Wiersz nie została rozpoznana jako dopuszczalna data-czas".
I problem w KOMPUTERZE, w którym będą używane w amerykańskim formacie (tylko zmienili nam format do testowania), więc może tu ktoś proszę mi pomóc, aby dodać w proces konwersji składni zdania/s, aby określić bezpośrednio w kodzie stały format, co trzyma statyczny format wyjściowy samodzielnie o PC zegar format daty i czasu, i jeśli jedno z wejść w plik "11/23/21, 1:00 PM", a następnie podać kod, który chcesz stwierdzić się w formacie "DD-MMM-rrrr gg:mm" , aby mieć wynik, jak "23-listopada-2021 01:00"
Sekcja kodu w skrypcie, który jest używany do konwersji, jest:
…
$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
…
Przykład surowych danych źródłowych (w pliku CVS dziesiątki wierszy, takich następnej):
...(DTRE|49.0|48.2);...;11/23/21, 12:58 PW...;
...(DTRE|52.1|52.0);...;11/23/21, 1:00 PW...;
...
...
I wynik wygląda tak:
Próbowałem użyć przykłady DateTime w innych postach stąd (stackoverflow.com) dostosować kod do pracy na KOMPUTERZE bez korzystania z formatu daty i czasu i uzyskać wynik w formacie daty i czasu, opisany powyżej. Przykłady, takie jak:
'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 w tych przykładach PowerShell pokazuje się błąd:"nie można powiązać argument do opcji 'InputObject', bo jest on równy zeru".
Aktualizacja po odpowiedzi od @Seth:
Przy próbie kolejnej modyfikacji kodu, z formatem daty systemowej KOMPUTERA w "24-21 listopada" i pozostawiając resztę jak wyżej:
…
$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
lub , na przykład, do nazwy kulturyes-ES
lub coś podobnego", tzn. podaje się bezpośrednio w kodzie jako uniwersalny/uniwersalny sposób, gdzie to działa niezależnie od tego, czy komputer jest w formacie daty i czasu w języku angielskim, lub jeśli komputer jest w formacie daty i czasu w języku hiszpańskim, lub jeśli komputer znajduje się we francuskim formacie daty i czasu