PowerShell CSV dosyası dönüştürme hataları, giriş dosyasının farklı DateTime formatına sahip olması nedeniyle

0

Soru

Powershell'i dönüştürmek için bir komut dosyasıyla kullanıyorum .CSV ham veri dosyası, ayrı sütunlar, daha temiz bir görünüm vb. İle daha yönetilebilir veri formatına dönüştürülür. Ve ham verilere sahip kaynak dosya ABD tarih ve saat biçiminde olduğundan (örneğin 11/23/21, 1: 00 PM), PC aynı ABD biçimindeyse, dönüştürme işlemi 0 hatalarında olması gerektiği gibi mükemmel şekilde çalışır. ANCAK, bilgisayar farklı bir ülke tarih ve saat biçimindeyse, PowerShell işlemdeki hataları kırmızı renkte gösterir.

Bilgisayar başka bir DateTime biçiminde olduğunda, ana hatanın şu olduğunu görüyorum:

"1 "bağımsız değişkeni(ler) ile" Ayrıştırma": "Dize geçerli bir tarih zamanı olarak tanınmadı."

Ve sorun (test biçimi BİZE sadece değişen), işte sözdizimi veya cümle/sadece doğrudan kod içinde statik bir çıkış PC saat tarih ve saat biçimi hakkında bağımsız biçim tutar sabit bir biçim belirtmek için dönüştürme işlemi için ekleyin bana yardım edin lütfen biri olabilir, ve dosyanın içine girdi 11/23/21 ise “1:Bu kullanılacak PC format içimizde değil 00 PM” i belirtmek kodu istediğiniz çıktı biçimini “dd-MMM-yyyy hh:mm” için bir sonuç gibi “23-Nov-2021 01:00 PM”

Dönüştürme için kullanılan komut dosyasındaki kod bölümü şöyledir:

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

Ham kaynak veri örneği (CVS dosyasında bir sonrakine benzer düzinelerce satır vardır):

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

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

...

...

Ve Çıkış gibi görünüyor:

enter image description here

Buradan diğer yayınlarda DateTime örnekleriyle denedim (stackoverflow.com) kodu, ABD tarih ve saat biçimi olmayan bir bilgisayarda çalışacak şekilde ayarlamak ve yukarıda açıklanan DateTime biçimi sonucunu elde etmek. Aşağıdaki gibi örnekler:

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

Ancak bu örneklerle PowerShell, “Null olduğu için bağımsız değişkeni 'InputObject' parametresine bağlayamıyor " hatasını gösterir”

@Seth'den gelen cevaptan sonra güncelleme:

Kodun bir sonraki değişikliğini denerken, PC sistem tarih formatı "24-Nov-21" ile ve geri kalanını yukarıdaki gibi bırakarak:

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

ardından, PowerShell aşağıdaki hataları gösterir: enter image description here

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

En iyi cevabı

1

Açıklandığı gibi, csv'yi daha iyi bir veri formatına sahip olacak şekilde düzeltmek iyi bir fikirdir. Bir örnek, ISO 8601 ile birlikte kullanılabilirGet-Date -Format "o".

Bu, Get-Date'in arka planda C# şeylerine dayandığını söyledi. Bu şekilde, belirli bir kültürde okumak için C# kodunu kullanabilirsiniz. Köken kültürünü bildiğiniz gibi bu işe yaramalı. Zaman damgasını düzeltmek hala daha iyi bir fikirdir.

$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

Bu örnek kodla atayacaksınız $dateString değeri $item.' Date/Time' ve muhtemelen istediğiniz sonuç, aşağıdakilerin sonucu olacaktır Get-Date. Yani sen atayacaksın $dtreData.'DateTime' sonuç Get-Date çağrı. Alternatif olarak, doğrudan belirli bir kültüre dönüştürmek için. NET DateTime Nesnesini kullanmak mümkündür. Örneğin arayarak $dateTime.ToString((New-Object System.Globalization.CultureInfo("en-ES"))). Tüm bu yararlı olmasa da, biçim tanımlayıcısını bu yönteme de iletebilirsiniz. Ek nesneler oluşturmaktan kaçınmak istiyorsanız bu konuyla ilgili olabilir. Biraz gereksiz bir çağrı olurdu $dateTime.ToString("o", (New-Object System.Globalization.CultureInfo("en-ES"))) (biçim o her kültürde aynıdır).

2021-12-01 06:41:00

Cevabınız için teşekkürler @Seth ama henüz bir çözüm yok. Kodu satırlarınızla değiştirmeyi denedim, ancak yine de tarih ve saati doğrudan kodda belirtilen bir biçimde alamıyorum, " CSV giriş dosyasındaki her DateTime değerini alın ve bunları formata dönüştürün dd-MMM-yyyy hh:mm veya örneğin kültür adına es-ES veya benzer bir şey", yani PC'nin ingilizce tarih ve saat biçiminde olup olmadığına veya PC'nin ispanyolca tarih ve saat biçiminde olup olmadığına veya PC'nin Fransızca tarih ve saat biçiminde olup olmadığına bakılmaksızın, bunun çalıştığı evrensel / genel bir yol olarak doğrudan kodda belirtilmesi
adiario

Satırlarınızla, kodun bir sonraki değişikliğini, ABD formatındaki PC sistem tarihi ile denedim: $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 } ve dönüşüm hatasız çalışır, ancak sonucu ABD biçiminde verir ve işletim sistemi tarih biçimine bağlıdır.
adiario

Ayrıca, “24-Nov-21 " deki PC sistem tarih formatıyla kodun bir sonraki değişikliğini de denedim”: …$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 ve burada PowerShell şöyle hatalar veriyor:”Export-Csv : Argümanı 'InputObject' parametresine bağlayamıyor çünkü null"
adiario

Hakkında Get-Date -Format "o" $dateTime Soruda yayınlanan koddaki yerini gerçekten bilmiyorum. Son satırda veya sonrasında olduğu gibi birden çok yere koymaya çalıştım 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo)) veya içine, ancak PowerShell hata verir. Hakkında $dateString = "11/23/21, 12:58 PM"; Bu bölümü kullanmadım çünkü bunun bir giriş örneği olacağını görüyorum ve bu durumda giriş DateTime değerleri zaten çalışılması gereken değerler olan CSV dosyasına giriyor.
adiario

@ Seth'in nasıl olduğunu biliyorsanız, lütfen yukarıdaki soruda yayınlanan kodu değiştirebilir ve tarih ve saat için ihtiyacım olan sonuca sahip olmak için gerekli değişiklikleri ekleyebilir misiniz? Zaman ayırdığınız için çok teşekkür ederim!
adiario

Belirli bir kültüre sahip bir datetime nesnesi oluşturuyorsunuz. İstersin senin $dtreData olmak Get-Date -Format "o" $dateTime. A Get-Date kullanım $dateTime girdi olarak normal yerel ayarınızı da kullanmalısınız. Alternatif olarak, çıktılanacak yerel ayarı açıkça tanımlayabilirsiniz, örn. $localDT.ToString((New-Object System.Globalization.CultureInfo("en-ES"))).
Seth

Diğer dillerde

Bu sayfa diğer dillerde

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