PowerShell CSV fișier erori de conversie din cauza PC-ului cu diferite DateTime format de fișier de intrare

0

Problema

Eu sunt, folosind PowerShell script-ul pentru a converti o .CSV prime fișier de date mai ușor de gestionat în format de date cu coloane separate, un aspirator de vedere etc. Și deoarece fișierul sursă cu datele brute este în NOI, data și formatul de timp (de exemplu, 11/23/21, 1:00 PM), apoi, dacă PC-ul este în același NE-a format de procesul de conversie ruleaza perfect ca ar trebui cu 0 erori. DAR, dacă PC-ul este într-o altă țară, format dată și oră, apoi PowerShell arată erori în roșu în acest proces.

Atunci când PC-ul este în alt format DateTime vad ca principala eroare este:

"Analiza" cu "1" argument(e): "String nu a fost recunoscut ca valabil DateTime."

Și problema este la PC-ul în cazul în care acesta va fi folosit nu este în NOI format (schimbat numai la NOI format pentru testare), deci ar putea cineva de aici te rog ajută-mă pentru a adăuga la procesul de conversie sintaxa sau propoziție/s să specificați pur și simplu direct în cod un format fix, care ține un statice de ieșire format independent despre PC-ul ceas format dată și oră, și dacă una din intrările în fișierul este "11/23/21, 1:00 PM", apoi să specificați în codul vrei ieșire în formatul "dd-MMM-yyyy hh:mm" pentru a avea un rezultat de genul "23-Nov-2021 01:00 PM"

Secțiunea de cod în script folosit pentru conversie este:

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

Exemplu de materii prime sursa de date (în fișier CVS sunt zeci de linii, cum ar fi cea următoare):

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

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

...

...

Și de Ieșire arată astfel:

enter image description here

Am incercat cu DateTime exemple în alte posturi de aici (stackoverflow.com) pentru a regla cod pentru a lucra într-un PC, fără a NE data și formatul de timp și pentru a obține format DateTime rezultatul descris mai sus. Exemple cum ar fi:

'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))
…

Dar cu aceste exemple PowerShell arată eroare "nu se Poate lega argument pentru parametrul 'InputObject' pentru că aceasta este nulă"

Update după răspunsul de la @Seth:

Atunci când încearcă următoarea modificare a codului, cu PC-ului de sistem format dată în "24-Nov-21" și lăsând restul ca mai sus:

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

apoi, PowerShell prezinta urmatoarele erori: enter image description here

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

Cel mai bun răspuns

1

Cum s-a explicat că e o idee bună pentru a repara CSV pentru a avea o mai bună dateformat. Un exemplu ar fi ISO 8601 care poate fi folosit cu Get-Date -Format "o".

Asta a spus sa-Data se bazează pe C# lucrurile în fundal. Astfel încât să puteți utiliza C# cod pentru a citi că într-o anumită cultură. După cum știți originea culturii, acest lucru ar trebui să funcționeze. Fixarea timestamp este încă o idee mai bună.

$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

Cu acest exemplu de cod ai atribui $dateString valoarea de $item.' Date/Time' și rezultatul probabil ar fi rezultatul Get-Date. Deci, v-ar atribui $dtreData.'DateTime' rezultatul Get-Date apel. Alternativ este posibil de a utiliza .NET Obiect DateTime pentru a converti direct la o anumită cultură. De exemplu, de asteptare $dateTime.ToString((New-Object System.Globalization.CultureInfo("en-ES"))). Deși nu tot atât de util, ai putea trece, de asemenea, formatul de identificare la această metodă. Acest lucru ar putea fi relevante dacă doriți, pentru a evita crearea de obiecte suplimentare. O oarecum inutile apel ar fi $dateTime.ToString("o", (New-Object System.Globalization.CultureInfo("en-ES"))) (ca format o este același în fiecare cultură).

2021-12-01 06:41:00

Multumesc pentru raspuns @Seth, dar nici o soluție încă. Am încercat modificarea codului cu replicile tale, dar eu sunt încă în imposibilitatea de a obține data și ora într-un format specificat direct în cod, spunând "ia fiecare valoare DateTime în CSV fișier de intrare și de a le converti la formatul dd-MMM-yyyy hh:mmsau, de exemplu, la cultura numele es-ESsau ceva similar", adică a fi specificată direct în cod ca un universal/mod generic în cazul în care aceasta funcționează indiferent dacă PC-ul este în limba engleză, format dată și oră, sau dacă PC-ul este în limba spaniolă, format dată și oră, sau dacă PC-ul este în limba franceză, format dată și oră
adiario

Cu linii, am încercat următoarea modificare a codului, cu PC-ului de sistem data în NOI format: $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 } și de conversie funcționează fără erori, dar oferă rezultatul în NOI format & fiind dependentă de OPERARE, formatul datei.
adiario

Am încercat, de asemenea, la următoarea modificare a codului, cu PC-ului de sistem format dată în "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 și aici PowerShell da erori, spunând: "Export Csv : nu se Poate lega argument pentru parametrul 'InputObject' pentru că aceasta este nulă"
adiario

Despre Get-Date -Format "o" $dateTime Eu chiar nu stiu unde ar fi locul său în a postat codul în cauză. Am încercat să-l pună în mai multe locuri ca în ultima linie, sau după 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo)), sau în ea, dar PowerShell dă erori. Despre $dateString = "11/23/21, 12:58 PM"; Nu am folosit această parte pentru că am văzut că ar fi o intrare de exemplu și în acest caz, intrare DateTime valori sunt deja în fișier CSV, care sunt valorile care trebuie să fie lucrat.
adiario

În cazul în care știi cum @Seth, ai putea, te rog modifica codul postat în întrebarea de mai sus și adăugați-l la modificările necesare pentru a avea rezultatul de care am nevoie pentru data și ora. Vă mulțumesc foarte mult pentru timpul acordat!
adiario

Creați un obiect datetime cu o cultură specifică. Ai vrea $dtreData pentru a fi Get-Date -Format "o" $dateTime. O Get-Date folosind $dateTime ca date de intrare ar trebui să, de asemenea, folosiți-vă regulat locale. Alternativ, puteți defini în mod explicit locale pentru producția de exemplu, folosind $localDT.ToString((New-Object System.Globalization.CultureInfo("en-ES"))).
Seth

În alte limbi

Această pagină este în alte limbi

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