PowerShell CSV súbor konverzie chyby spôsobené PC s rôznymi DateTime formát vstupného súboru

0

Otázka

Som pomocou PowerShell skript na konverziu .CSV raw data súbor do viac zvládnuteľnú formát dát s samostatných stĺpcov, čistejšie zobrazenie a pod. A pretože zdrojový súbor s surových dát je v NÁS, formát dátumu a času (napr. 11/23/21, 1:00 HOD.), potom, ak POČÍTAČ je v tom istom NÁM formát konverzie proces funguje perfektne ako by s 0 chyby. ALE, ak POČÍTAČ je v inej krajine, formát dátumu a času, potom PowerShell ukazuje chyby v červenej farbe v procese.

Ak je PC je v iných DateTime formát vidím, hlavná chyba je:

"Analyzovať" s "1" argument(y): "Reťazec nebol uznaný ako platný DateTime."

A problém je na PC, kde to bude možné použiť, nie je v NÁS formáte (iba zmenili k NÁM formát pre testovanie), tak by tu niekto prosím, pomôžte mi pridať k procesu premeny syntaxe alebo vety/s jednoducho zadať priamo v kóde pevný formát, ktorý uchováva statické výstupný formát nezávisle o PC hodiny dátum a formát času, a ak jeden zo vstupov do súboru je "11/23/21, 1:00 PM", potom zadať kód chcete výstup vo formáte "dd-MMM-rrrr hh:mm" mať výsledok, ako napríklad "23-Nov-2021 01:00 PM"

Kód sekcie v skripte používa na konverziu, 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
…

Príklad surovín zdroj údajov (v CVS súbor niekoľko desiatok riadkov, ako ďalej):

...(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 vyzerá:

enter image description here

Snažil som sa s DateTime príklady v iných príspevkov z tu (stackoverflow.com ak chcete zmeniť kód, ak chcete pracovať v PC bez NÁS, formát dátumu a času a získať DateTime formát výsledok je popísané vyššie. Príklady ako:

'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 tieto príklady PowerShell zobrazuje chyba "Nemôže viazať argument na parameter "InputObject", pretože to je null"

Aktualizácia po odpoveď od @Seth:

Pri pokuse ďalšej úpravy kódu, s PC systémový dátum vo formáte v "24-Nov-21" a zanechania zvyšku, ako je uvedené vyššie:

…
$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
…

potom, PowerShell ukazuje nasledujúci chyby: enter image description here

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

Najlepšiu odpoveď

1

Ako to bolo vysvetlené je to dobrý nápad, CSV opraviť mať lepšie dateformat. Príkladom môže byť ISO 8601, ktoré môžu byť použité s Get-Date -Format "o".

To povedal Si-Dátum spolieha na C# veci v pozadí. Takže môžete použiť C# kód prečítať , že v určitej kultúry. Ako viete, pôvod kultúry by to malo fungovať. Stanovenie časová značka je ešte lepší nápad.

$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

S týmto príkladom kódu chcete priradiť $dateString hodnota $item.' Date/Time' a výsledok pravdepodobne budete chcieť by byť výsledkom Get-Date. Takže by ste priradiť $dtreData.'DateTime' výsledkom toho Get-Date hovor. Alternatívne je možné použiť .ČISTÝ DateTime Objekt priamo previesť do určitej kultúry. Napríklad telefonicky) $dateTime.ToString((New-Object System.Globalization.CultureInfo("en-ES"))). Hoci nie všetky, že užitočné môžete tiež prejsť formát identifikátora k tejto metóde. To môže byť dôležité, ak chcete, aby sa zabránilo vzniku ďalších objektov. Trochu zbytočné volať by sa $dateTime.ToString("o", (New-Object System.Globalization.CultureInfo("en-ES"))) (ako formát, o je rovnaký v každej kultúre).

2021-12-01 06:41:00

Vďaka za vašu odpoveď @Seth, ale žiadne riešenie ešte. Snažil som sa úprava kódu s vaše riadky, ale ja som stále schopní získať dátum a čas vo formáte uvedené priamo v kóde, hovoriac: "vezmite každý DateTime hodnota v CSV vstupe súboru a previesť ich do formátu, dd-MMM-yyyy hh:mmalebo napríklad na kultúru meno es-ESalebo niečo podobné", t. j. sú uvedené priamo v kóde ako univerzálny/generic cestu tam, kde to funguje, bez ohľadu na to, či POČÍTAČ je v angličtine, formát dátumu a času, alebo ak je PC je v španielčine, formát dátumu a času, alebo, ak POČÍTAČ je vo francúzštine, formát dátumu a času
adiario

S vaše riadky, som sa snažil ďalšej úpravy kódu, s PC systémový dátum v NÁS, formát: $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 } a konverzií funguje bez chyby, ale dáva výsledok v NÁS formát & je závislá na OS formát dátumu.
adiario

Tiež som sa snažil ďalšej úpravy kódu, s PC systémový dátum vo formáte v "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 a tu PowerShell dáva chyby hovorí: "Export Csv : Nemôže viazať argument na parameter "InputObject", pretože to je null"
adiario

O Get-Date -Format "o" $dateTime Ja naozaj neviem, kde by bolo jeho miesto v zaslali kód na otázku. Snažil som sa, aby to na viacerých miestach ako v poslednom riadku, alebo po 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))alebo sa do nej, ale PowerShell dáva chyby. O $dateString = "11/23/21, 12:58 PM"; Nechcel som použiť túto časť, pretože vidím, že by vstup príklad a v tomto prípade vstupu DateTime hodnoty sú už do súboru CSV, že sú hodnoty, ktoré musia byť spracované.
adiario

V prípade, že budete vedieť, ako @Seth, mohli by ste, prosím, upravte kód publikované v otázke vyššie a pridať ich potrebné úpravy, aby sa výsledok potrebujem pre dátum a čas. Ďakujem vám veľmi pekne za váš čas!
adiario

Vytvárate datetime objekt so špecifickou kultúrou. Budete chcieť svoj $dtreData byť Get-Date -Format "o" $dateTime. A Get-Date pomocou $dateTime ako vstup by mal tiež použiť vaše pravidelné locale. Prípadne by ste mohli explicitne definovať miestne nastavenia výstupu napr. pomocou $localDT.ToString((New-Object System.Globalization.CultureInfo("en-ES"))).
Seth

V iných jazykoch

Táto stránka je v iných jazykoch

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