IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Remplacer un timestamp par une date


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 10
    Points
    10
    Par défaut Remplacer un timestamp par une date
    Bonjour, (bonsoir plutôt)

    je vous expose mon problème (enfin, ma demande plutôt).

    J'ai un fichier au format csv, dans la première colonne, j'ai un timestamp.
    Je veux remplacer ce timestamp par une date.

    Mon problème est que mon fichier csv peut avoir une taille variable (quelques ko à plusieurs centaines de mégas).
    J'ai besoin de faire cette opération de manière la plus rapide et optimisée possible.

    J'ai réalisé ce script, j'aurais voulu savoir si il n'y avait pas un meilleur moyen de le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/bin/sh
     
    chemincsv=`cat fichiercsv | awk 'BEGIN {FS = ";" }; {print $1}'`
    chemincsv2=fichiercsv
     
    for timestamp in $chemincsv
    do
                    result=`awk 'BEGIN{print strftime( "%d/%m/%Y %H:%M:%S", '$timestamp' )}'`
                    sed -i "s#$timestamp#$result#" $chemincsv2
    done

    PS: j'ai mis des # car le / me posait des problèmes par rapport au contenu.

    Merci pour vos réponses.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    En fait, j'ai plus ou moins trouvé la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{gsub($1,strftime("%c ",$1),$0); print $0} monfichiercsv
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ' { $1=strftime("%c",$1); print }' monfichiercsv
    Seulement, ça me l'affiche seulement.
    Je suis obligé de recréer un nouveau fichier ? Il n'est pas possible de faire la modification directement dans le fichier existant ?

  3. #3
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour,

    La dernière solution est proche. Cependant, je me demande comment ça peut marcher sans avoir donné le séparateur. Et ensuite il faut envoyer le tout vers un autre fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ',' '{$1=strftime("%c", $1); print}' file_in > file_out

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Ok.
    Il n'existerait donc pas de solution avec awk qui fonctionnerait sur le même principe que le sed pour remplacer déjà mon fichier.

    PS: pour les deux solutions que j'ai donnés (avec awk) elles sont fonctionnelles.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Il te suffit d'émuler ce que sed fait en interne avec l'option -i: créer une copie du fichier, travailler sur celle-ci et ensuite copie inverse. En plus, il te reste une sauvegarde en cas de bêtise (tout comme avec le suffixe de l'option i de sed).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cp fichier > fichier.bak
    awk '.........' fichier.bak > fichier

  6. #6
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonjour Fabinounours,

    Si tu as décrit correctement le problème, les solutions que tu as exposées contiennent un, et même deux, gros bugs:

    1. Sans définir correctement le séparateur de champ comme étant la virgule (format fichier csv), tu vas faire une bonne conversion mais faire un mauvais remplacement: le champ 1 ne s'arrêtant pas à la virgule mais au premier espace trouvé! S'il n'y a pas d'espace dans la ligne, c'est tout le reste qui disparaîtra.
    2. Il faut également définir le séparateur de sortie. Je l'avais aussi oublié. Sinon la commande awk remplacera toutes les virgules par des espaces. Or, s'il y a déjà des espaces dans les champs, il sera impossible de revenir en arrière.

    La commande qui marche est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ',' 'BEGIN {OFS=FS} {$1=strftime("%c", $1); print}' file_in > file_out
    PS: Il est bon de créer un autre fichier pour le résultat, de vérifier à la main avant de remplacer le fichier source (nombre de lignes, nombre de champs, lecture...). Parce que perdre des fichiers de 100 MB, c'est pas cool.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Points : 10
    Points
    10
    Par défaut
    Ok, merci pour la réponse jmelyn
    J'ai juste remplacé la virgule par un ; car mes champs contiennent des virgules

    Merci beaucoup pour ces informations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment remplacer la date d'un champ timestamp par une autre date ?
    Par clavier12AZQSWX dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/12/2011, 17h27
  2. Remplacer un caractère par une image
    Par mr.t dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 27/10/2005, 09h18
  3. Réponses: 4
    Dernier message: 13/10/2005, 14h44
  4. Réponses: 2
    Dernier message: 26/07/2005, 21h44
  5. Comment comaprer un timestamp et une date en SQL
    Par Samuel25_t dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/06/2005, 21h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo