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 :

Identifier une date et changer son format


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Bioingénieur
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bioingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Identifier une date et changer son format
    Bonjour,

    J'aimerais modifier le format des dates d'un fichier dans un script.
    Voici à quoi ressemble mon fichier d'entrée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    anim1;herd1;breed1;20/02/2012;22/05/2011;126
    anim1;herd1;breed1;18/03/2012;22/05/2011;158
    anim2;herd1;breed1;14/11/2012;06/09/2012;61
    anim2;herd1;breed1;20/12/2012;06/09/2012;97
    ...
    et voici à quoi je voudrais que mon fichier de sortie ressemble:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    anim1;herd1;breed1;2012-02-20;2011-05-22;126
    anim1;herd1;breed1;2012-03-18;2011-05-22;158
    anim2;herd1;breed1;2012-11-14;2012-09-06;61
    anim2;herd1;breed1;2012-12-20;2012-09-06;97
    ...
    J'imaginais qu'il fallait d'abord que je lise les colonnes $4 et $5 en indiquant qu'il s'agit de date ayant le format "+%d/%m/%Y"
    et ensuite lui demander de réécrire ces mêmes colonnes avec le format date "+%F" ou "+%Y-%m-%d"

    mais en fait je n'ai aucune idée de comment faire cela et je ne sais même pas si c'est possible ??

    Merci de votre aide ...

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    d'abord, lire Comment lire/parcourir un ficher en shell,
    ensuite, quand tu as récupéré les dates, il faut les "éclater" en se basant sur leur séparateur (car date ne reconnaît pas ce type de date), et les reconstituer comme tu le souhaites.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Profil pro
    Bioingénieur
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bioingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Bon c'est un peu du bidouillage mais voilà comment j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';' '{print $4}' InFileName | awk -F'/' '{print $3,$2,$1}' | sed -i 's/ /-/g' > Out1
    je fais la même chose pour $5, j'ai donc 2 fichiers : Out1 et OUt2
    et je peux insérer ces deux sous-fichiers pour recréer le fichier que je veux ....

    c'est un peu brouillon comme manière de faire ... je pensais qu'il y avait moyen de travailler avec les formats de date ....

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par pantouflebdv Voir le message
    Voici à quoi ressemble mon fichier d'entrée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    anim1;herd1;breed1;20/02/2012;22/05/2011;126
    anim1;herd1;breed1;18/03/2012;22/05/2011;158
    anim2;herd1;breed1;14/11/2012;06/09/2012;61
    anim2;herd1;breed1;20/12/2012;06/09/2012;97
    ...
    et voici à quoi je voudrais que mon fichier de sortie ressemble:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    anim1;herd1;breed1;2012-02-20;2011-05-22;126
    anim1;herd1;breed1;2012-03-18;2011-05-22;158
    anim2;herd1;breed1;2012-11-14;2012-09-06;61
    anim2;herd1;breed1;2012-12-20;2012-09-06;97
    ...
    Un simple sed devrait suffire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo 'anim1;herd1;breed1;20/02/2012;22/05/2011;126' | sed -e 's|;\([0-3][0-9]\)/\([01][0-9]\)/\([12][0-9][0-9][0-9]\)|;\3-\2-\1|g'
    anim1;herd1;breed1;2012-02-20;2011-05-22;126
    Bugs connus:
    - ne remplace rien si la date est dans la première colonne
    - donne de mauvais résultats s'il y a des trucs trop gros comme ";20/02/20129"
    - ne convertit pas les dates sans zéro (comme ";1/1/1970")
    - ne convertit pas les dates farfelues (comme ";42/25/3014")

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    - ne convertit pas les dates sans zéro (comme ";1/1/1970")
    Bonjour

    On peut arranger ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/\([0-9]\{1,2\}\)\/\([0-9]\{1,2\}\)\/\([0-9]\{2,4\}\)/\3-\2-\1/g" fichier
    Citation Envoyé par jack-ft Voir le message
    - ne convertit pas les dates farfelues (comme ";42/25/3014")
    Ma commande convertit ce genre de date (en fait elle inverse tout groupe de 1 ou 2/1 ou 2/2 ou 4 chiffres). Est-ce une bonne ou une mauvaise chose...? Personnellement, partisan de l'outil minimaliste (chaque outil ne fait qu'une chose mais le fait bien) j'aurais tendance à penser que le but de cette commande n'étant pas de checker la validité d'une date mais juste de permuter les chiffres, ça reste une bonne chose (à chacun son job quoi)...

    Citation Envoyé par pantouflebdv Voir le message
    je pensais qu'il y avait moyen de travailler avec les formats de date ....
    C'est possible. Faut d'abord extraire la date, puis l'envoyer à la commande "date" qui pourra alors la checker et te la retourner au format attendu puis réinsérer ce retour dans ton fichier. Tout dépend en fait de ton besoin. Est-ce juste inverser les chiffres ou faire un peu plus...?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 284
    Points : 12 739
    Points
    12 739
    Par défaut
    Bonjour,
    En awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat conv.txt
    anim1;herd1;breed1;20/02/2012;22/05/2011;126
    anim1;herd1;breed1;18/03/2012;22/05/2011;158
    anim2;herd1;breed1;14/11/2012;06/09/2012;61
    anim2;herd1;breed1;20/12/2012;06/09/2012;97
    $ awk -F'[;/]' '{print $1";"$2";"$3";"$6"-"$5"-"$4";"$9"-"$8"-"$7";"$10}' conv.txt
    anim1;herd1;breed1;2012-02-20;2011-05-22;126
    anim1;herd1;breed1;2012-03-18;2011-05-22;158
    anim2;herd1;breed1;2012-11-14;2012-09-06;61
    anim2;herd1;breed1;2012-12-20;2012-09-06;97
    Cordialement.

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Hum, tu présumes que la date se trouve uniquement dans les champs 4 et 5 ce qui limite vachement non ?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    un fichier csv se doit d'avoir une certaine cohérence, quand même.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    un fichier csv se doit d'avoir une certaine cohérence, quand même.
    Ben il y a la théorie et la réalité. Tu n'as pas idée de ce à quoi on est confronté tous les jours. Pourtant nous avons des formats "standardisés", actés, acceptés (et plein d'autres synonymes en "és" qui disent bien que c'est promis on ne recevra que des trucs cohérents). Et pourtant on reçoit quand-même des trucs qui n'y rentrent pas alors qu'ils devraient.

    Alors on tente quand-même, avec nos moulinettes, de ratrapper mais parfois quand on peut pas...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    [HS]
    Citation Envoyé par Sve@r Voir le message
    Et pourtant on reçoit quand-même des trucs qui n'y rentrent pas alors qu'ils devraient.

    Alors on tente quand-même, avec nos moulinettes, de ratrapper mais parfois quand on peut pas...
    Il y a quelques années, le programme que je devais maintenir était client d'un fournisseur qui générait parfois des données erronées. Il y avait pas mal de code pour essayer de rattraper (avec 2T 1P) les données fournies...
    Et puis, un jour qu'elle avait un peu moins la pression, la responsable du programme fournisseur a demandé plus de rigueur.
    Dans un premier temps, on a continué à rafistoler les données reçues, mais on a ajouté plus de contrôle de cohérence des données, avec des traces éloquentes qui ont permis de mettre en évidence les bugs du fournisseur et de les corriger.
    Dans un deuxième temps (au bout d'un certain temps), au lieu de rattraper les données, on a systématiquement et délibérément provoqué des erreurs en cas de données non conformes, ce qui a permis de mettre en évidence le reliquat des bugs du fournisseur et de les corriger.
    Cette opération a permis d'améliorer la qualité du programme fournisseur et de rendre plus clair et plus rigoureux (avec des contrôles systématiques en entrée) le programme client.
    Évidemment, il y a un coût à payer!
    Mais, au final, tout le monde y gagne.
    [/HS]

  11. #11
    Futur Membre du Club
    Profil pro
    Bioingénieur
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Bioingénieur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Super! Merci à tous pour vos éléments de réponses

    Je vais essayer les solutions avec sed et awk et voir ce qui fonctionne le mieux, et surtout qui me prend le moins de temps/ressources possibles (j'imagine que c'est avec awk ...)
    Dans tout les cas ça a l'air bcp mieux que mon bidouillage ;-)

    Hum, tu présumes que la date se trouve uniquement dans les champs 4 et 5 ce qui limite vachement non ?
    En effet, les dates au format problématique sont uniquement dans ces champs là.

    un fichier csv se doit d'avoir une certaine cohérence, quand même.
    Oui oui ... vive la théorie !!!
    En fait je suis sûre de mon format de fichier, et (normalement) il n'y a pas d'erreurs pcq mon fichier à traiter est déjà passé par une panoplie de checks, vérifications et nettoyages en tout genre. Bref il ne me reste plus que ce "petit détail" à corriger pour aller plus loin.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 284
    Points : 12 739
    Points
    12 739
    Par défaut
    Voici une méthode awk améliorée par rapport à la première:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v FS="[;/]" -v OFS=";" '{$4=$6"-"$5"-"$4;$5=$9"-"$8"-"$7;for(i=6;i<=NF;i++) $i=$(i+4);NF=NF-4}1' conv.txt
    Pour la petite explication:
    FS="[;/]" ==> les séparateurs de champs en entrée sont soit le ";" soit le "/", donc ici chaque ligne de ton fichier possède non plus 6 champs mais 10.
    OFS=";" ==> ceci sera le séparateur de champs pour la sortie (voir doc awk).
    Les 2 dates sont ici constituées par les champs $4,$5,$6 et $7,$8,$9.
    Pour la première date, on la mais au format voulu dans le champs $4 ce qui donne donc => $4=$6"-"$5"-"$4
    Pour la deuxieme date, on la mais au format voulu dans le champs $5 ce qui donne donc => $5=$9"-"$8"-"$7
    Ensuite on doit décaler tout les champs à partir du $10 jusqu'au dernier de 4 champs vers la gauche, donc on prends la valeur du champs $10 on la met dans le champs $6
    S'il y avait un champs $11, sa valeur irait dans le champs $7,etc... et ceci jusqu'au dernier champs.
    Puis on reduit NF de 4 qui est la variable awk qui représente le nombre de champs et le tour est joué.
    le "1" final, est juste pour dire à awk que l'on est dans un retour TRUE et donc de le forcer à faire un print $0
    Cordialement.

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

Discussions similaires

  1. [Calendrier] convertir une date en format date de mysql
    Par khadi8 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 13/12/2012, 20h58
  2. Récupérer une date à partir d'un format UNIX
    Par Spack dans le forum Programmation et administration système
    Réponses: 8
    Dernier message: 09/02/2009, 14h46
  3. Réponses: 2
    Dernier message: 10/03/2007, 09h14
  4. Réponses: 6
    Dernier message: 25/09/2006, 14h51
  5. Réponses: 14
    Dernier message: 29/06/2005, 10h22

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