J'ai un fichier CSV avec une colonne de date au format dd/MM/YYY HH:mm:ss, par exemple 14/11/2016 00:00:00.

J'essaie de convertir par lots le formatage de cette colonne en un format de date ISO-8601: YYYY-mm-dd HH:mm:ss

J'ai essayé: (j'ai édité j'ai eu une erreur sur le format de la chaîne d'entrée ...)

Import-Csv someCSV.csv | % {
  $_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss").ToString('yyyy-MM-dd HH:mm:ss'))
} | Export-Csv 'C:\testBis.csv' -NoTypeInformation

Je reçois une erreur:

Cannot find an overload for "ParseExact" and the argument count: "2".
At line:1 char:69
+ ... Date]' ; ([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYY HH ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

J'ai jeté un coup d'œil et essayé avec Tryparse et quelques idées sérieuses mais rien ne fonctionnait.

Je ne sais pas ce que je vais mal. Aucune suggestion?

0
maco1717 17 janv. 2017 à 15:38

2 réponses

Meilleure réponse

Le modèle de correspondance avec l'année doit être yyyy ( avec des minuscules y), il n'y a pas de virgule dans votre exemple de date et vous devez fournir des informations de culture pour ParseExact(). Je recommanderais également d'échapper aux barres obliques, sinon elles correspondront au séparateur de date configuré dans les paramètres régionaux de l'ordinateur. Et vous devez renvoyer l'enregistrement modifié dans le pipeline, sinon il n'y aurait rien à exporter.

$culture = [Globalization.CultureInfo]::InvariantCulture
Import-Csv someCSV.csv | ForEach-Object {
    $_.'[Date]' = [DateTime]::ParseExact($_.'[Date]', 'dd\/MM\/yyyy HH:mm:ss', $culture).ToString('yyyy-MM-dd HH:mm:ss')
    $_    # <-- feed modified record back into pipeline
} | Export-Csv 'C:\testBis.csv' -NoType
1
Ansgar Wiechers 17 janv. 2017 à 14:38

DateTime.ParseExact nécessite au moins trois paramètres. Le troisième paramètre est la culture à utiliser. Vous pouvez transmettre la culture invariante [System.Globalization.CultureInfo]::InvariantCulture, par exemple:

([datetime]::ParseExact(($_.'[Date]'),"dd/MM/YYYY HH:mm:ss",[System.Globalization.CultureInfo]::InvariantCulture)

Ou une version plus propre:

$inv = [System.Globalization.CultureInfo]::InvariantCulture
$fmtFrom = "dd/MM/YYY HH:mm:ss"
$fmtTo   = "yyyy-MM-dd HH:mm:ss"

Import-Csv someCSV.csv | % {
    $_.'[Date]' = ([datetime]::ParseExact(($_.'[Date]'),$fmtFrom, $inv).ToString($fmtTo))
  } | Export-Csv 'C:\testBis.csv' -NoTypeInformation

J'ai supprimé le , de la chaîne de format parce que vous avez mentionné que le format réel est dd/MM/YYY HH:mm:ss, pas dd/MM/YYY, HH:mm:ss

0
Panagiotis Kanavos 17 janv. 2017 à 12:44