PowerShell fichier CSV conversion les erreurs dues PC avec différents format DateTime que le fichier d'entrée

0

La question

Je suis à l'aide de PowerShell avec un script pour convertir un .CSV fichier raw, plus maniables format de données des colonnes séparées, un nettoyeur de vue etc. Et parce que le fichier source avec les données brutes est en NOUS format de date et heure (p. ex. 11/23/21, 1:00 PM), alors si le PC est dans le même format AMÉRICAIN le processus de conversion fonctionne parfaitement comme devrait l'être avec 0 erreurs. MAIS, si le PC est dans un pays différent format de date et heure, puis PowerShell montre les erreurs en rouge dans le processus.

Lorsque le PC est dans un autre format DateTime je vois la principale erreur est:

"Analyser" avec "1" argument(s): "la Chaîne n'a pas été reconnu comme un DateTime valide."

Et le problème est que le PC sur lequel il sera utilisé n'est pas au format AMÉRICAIN (seulement changé de format AMÉRICAIN pour les tests), donc quelqu'un pourrait ici s'il vous plaît m'aider à ajouter pour le processus de conversion de la syntaxe ou de la peine/s, il suffit de spécifier directement dans le code d'un format fixe qui maintient une statique format de sortie de façon indépendante sur l'horloge du PC format de date et heure, et si l'une des entrées dans le fichier est “11/23/21, 1:00” puis de préciser dans le code que vous voulez, la sortie dans le format “jj-MMM-aaaa hh:mm” pour avoir un résultat comme “23-Nov-2021 01:00 PM”

La section de code dans le script utilisé pour la conversion est la suivante:

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

Exemple de la crue de source de données (dans le fichier CVS sont des dizaines de lignes, comme celle-ci):

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

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

...

...

Et la Sortie ressemble à ceci:

enter image description here

J'ai essayé avec DateTime des exemples dans d'autres posts à partir d'ici (stackoverflow.com) pour ajuster le code fonctionne sur un PC sans que NOUS le format de date et heure et pour obtenir le format DateTime résultat décrit ci-dessus. Des exemples comme:

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

Mais avec ces exemples, PowerShell affiche le message d'erreur “Ne peut pas se lier argument de paramètre InputObject " parce que c'est nul

Mise à jour suite à la réponse de @Seth:

Lorsque vous essayez prochaine modification du code, avec le système de PC de format de date dans “24-Nov-21” et de laisser le reste comme ci-dessus:

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

ensuite, PowerShell montre les erreurs: enter image description here

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

La meilleure réponse

1

Comme il a été expliqué que c'est une bonne idée de fixer le CSV pour avoir une meilleure dateformat. Un exemple serait la norme ISO 8601, qui peut être utilisé avec Get-Date -Format "o".

Cela dit Get-Date repose sur C# les choses dans le contexte. Ainsi, vous pouvez utiliser le code C# pour lire que dans une culture particulière. Comme vous le savez, la culture d'origine cela devrait fonctionner. La fixation de l'horodatage est encore une meilleure idée.

$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

Avec cet exemple de code, vous auriez attribuer $dateString la valeur de $item.' Date/Time' et le résultat que vous souhaitez probablement serait le résultat de la Get-Date. Donc, si vous voulez attribuer $dtreData.'DateTime' le résultat de cette Get-Date appel. Alternativement, il est possible d'utiliser l' .NET Objet DateTime de convertir directement à une culture particulière. Par exemple, en appelant $dateTime.ToString((New-Object System.Globalization.CultureInfo("en-ES"))). Bien que pas tous utiles, vous pouvez aussi passer l'identificateur de format de cette méthode. Cela peut être utile si vous voulez éviter de créer des objets supplémentaires. Un peu inutile appel serait $dateTime.ToString("o", (New-Object System.Globalization.CultureInfo("en-ES"))) (comme format o est le même dans toutes les cultures).

2021-12-01 06:41:00

Merci pour votre réponse @Seth, mais pas de solution pour le moment. J'ai essayé de modifier le code de vos lignes, mais je suis toujours incapable d'obtenir la date et l'heure dans un format spécifié directement dans le code, en disant: “prenez chaque valeur DateTime au format CSV les fichiers d'entrée et de les convertir vers le format dd-MMM-yyyy hh:mmou par exemple pour le nom de culture es-ESou quelque chose de semblable”, c'est à dire être spécifiée directement dans le code comme un universel/méthode générique où cela fonctionne, peu importe si le PC est en anglais format de date et heure, ou si le PC est en espagnol format de date et heure, ou si le PC est en français, format de date et heure
adiario

Avec vos lignes, j'ai essayé de la prochaine modification du code, avec le système de PC date au format AMÉRICAIN: $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 } et la conversion fonctionne sans erreurs, mais en donnant le résultat en format AMÉRICAIN et dépend de l'OS format de date.
adiario

J'ai aussi essayé à la prochaine modification du code, avec le système de PC de format de date dans “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 et ici PowerShell donne des erreurs en disant: “Export-Csv : Ne peut pas lier argument de paramètre InputObject " parce que c'est nul”
adiario

Sur Get-Date -Format "o" $dateTime Je ne sais vraiment pas où serait sa place dans la posté code dans la question. J'ai essayé de le mettre dans plusieurs endroits, comme dans la dernière ligne, ou après 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))ou de dans les, mais PowerShell donne des erreurs. Sur $dateString = "11/23/21, 12:58 PM"; Je n'ai pas utiliser cette partie parce que je vois ce serait un exemple d'entrée et dans ce cas, la saisie des valeurs DateTime sont déjà dans le fichier CSV que sont les valeurs qui ont besoin d'être travaillé.
adiario

Dans le cas, vous savez comment @Seth, pourriez-vous s'il vous plaît modifier le code affiché dans la question ci-dessus et ajouter les modifications nécessaires pour avoir le résultat que j'ai besoin de la date et de l'heure. Je vous remercie beaucoup pour votre temps!
adiario

Vous créez un objet datetime avec une culture spécifique. Vous voulez votre $dtreData pour être Get-Date -Format "o" $dateTime. Un Get-Date à l'aide de $dateTime comme entrée doit également utiliser régulièrement vos paramètres régionaux. Vous pouvez également définir explicitement le paramètre de sortie en utilisant par exemple $localDT.ToString((New-Object System.Globalization.CultureInfo("en-ES"))).
Seth

Dans d'autres langues

Cette page est dans d'autres langues

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