Partage
  • Partager sur Facebook
  • Partager sur Twitter

Convertir dates de chaque ligne d'un fichier

4 juillet 2019 à 10:28:49

Bonjour,

J'ai un fichier de type csv comme cela :

CreateDate,champ2,champ3,champ4,...champ23
2017-06-01 23:38:14.904 UTC,val1.1,val1.2,val1.3,...val1.23
2017-06-02 23:38:14 UTC,val2.1,val2.2,val2.3,...val2.23
2017-06-03 23:38:14.904 UTC,val3.1,val3.2,val3.3,...val3.23
2017-06-04 23:38:14 UTC,val4.1,val4.2,val4.3,...val4.23


et je cherche a convertir a l'interieur de ce fichier les dates de la colonne $1

de "2017-06-04 23:38:14.123 UTC" a "2017-06-04T23:38:14Z" (comme vous pouvez le voir, il n'y a pas toujours les millisec ".123")

Je suis parti sur du awk avec la fonction system() et la commande date mais system print directement son resultat donc je me retrouve avec 2 lines a chaque fois ...

Merci :)

  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2019 à 10:52:02

salut,

s'il n'y a pas énormément de lignes dans ton fichier, en shell :

while read -r d reste; do echo "$(date --iso-8601=ns "$d"),$reste"; done <tonFichier



  • Partager sur Facebook
  • Partager sur Twitter

Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

4 juillet 2019 à 10:55:20

Bonjour !

Est-ce que un peu plus d'1 million c'est "pas enormement" ? Haha

[edit]

J'ai "date: invalid date ‘2017-06-01’" avec ton code en retour

J'ai essaye :

while read -r d h reste; do echo "$(date --iso-8601=ns "$d $h"),$reste"; done <file.txt

mais meme genre d'erreur : date: invalid date ‘2017-06-01 23:38:14.904’

Merci

[edit]

avec cette idee on s'y rapproche (IFS',' + -d devant la date) :

while IFS=',' read -r d reste; do echo "$(date --iso-8601=ns -d "$d"),$reste"; done <file.txt

mais j'ai une colonne de plus en millisec dans mon csv maintenant ...

(mais j'ai fait le test sur mon fichier de million de lignes c'est vraiment trop long)

Merci


-
Edité par GuiGui_69100 4 juillet 2019 à 11:33:07

  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2019 à 12:08:53

exact, j'avais oublié l'IFS et l'option -d de date. pour voir si tu avais suivi, bien sûr. XD

 $ awk 'BEGIN{cmd="date --iso-8601=ns -d ";FS=OFS=","}{cmd "\""$1"\"" | getline $1; print}' /tmp/fichier.test
2017-06-02T01:38:14,904000000+02:00,val1.1,val1.2,val1.3,...val1.23
2017-06-03T01:38:14,000000000+02:00,val2.1,val2.2,val2.3,...val2.23
2017-06-04T01:38:14,904000000+02:00,val3.1,val3.2,val3.3,...val3.23
2017-06-05T01:38:14,000000000+02:00,val4.1,val4.2,val4.3,...val4.23

?

  • Partager sur Facebook
  • Partager sur Twitter

Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

4 juillet 2019 à 12:29:34

Haha bien sur !

Merci pour solution #2, elle marche super mais pour les fichiers trop long ca donne :

awk: cmd. line:1: (FILENAME=file.csv FNR=1021) fatal: cannot open pipe `date --iso-8601=ns -d "2017-06-02 05:10:58.878 UTC"' (Too many open files)


et je n'ai que les 1020 premieres lignes dans mon fichier resultat

-
Edité par GuiGui_69100 4 juillet 2019 à 12:30:11

  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2019 à 12:34:33

ajoute un close("cmd"), après le print ?

  • Partager sur Facebook
  • Partager sur Twitter

Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

4 juillet 2019 à 12:37:17

awk 'BEGIN{cmd="date --iso-8601=ns -d ";FS=OFS=","}{cmd "\""$1"\"" | getline $1; print; close("cmd")}' file.csv

et

awk 'BEGIN{cmd="date --iso-8601=ns -d ";FS=OFS=","}{cmd "\""$1"\"" | getline $1; print; close(cmd)}' file.csv

Pareil ...

-
Edité par GuiGui_69100 4 juillet 2019 à 12:44:24

  • Partager sur Facebook
  • Partager sur Twitter
4 juillet 2019 à 12:46:18

ah. :(

et sans les guillemets ? close(cmd)

  • Partager sur Facebook
  • Partager sur Twitter

Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

4 juillet 2019 à 12:53:04

Desole j'ai du editer mon commentaire en meme temps que le tien

J'ai essaye aussi ... pourtant j'ai google le probleme j'ai bien cette solution qui revient ...

Je fais ca maintenant :

awk 'BEGIN{FS=OFS=",";cmd="date +%Y-%m-%dT%H:%M:%SZ -d \"$1\""}{cmd "\""$1"\"" | getline $1; print; close(cmd)}' file.csv

pour avoir mon Z a la fin haha mais meme probleme

Huuum, parce que cmd est defini dans le BEGIN ?

-
Edité par GuiGui_69100 4 juillet 2019 à 12:58:05

  • Partager sur Facebook
  • Partager sur Twitter