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

Applications et environnements graphiques Discussion :

extraction d'une chaine qui se répète périodiquement


Sujet :

Applications et environnements graphiques

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut extraction d'une chaine qui se répète périodiquement
    Bonjour tout le monde
    j'ai un fichier texte qui contient une structure périodique de taille fixe mais les chaines sont concaténés
    je vous donne un exemple: les date concaténés
    15/01/1016/01/1017/01/1018/01/10
    vous remarquez que la struture aa/bb/cc se repète elle est de taille fixe (x=8 dans ce cas)
    1)comment faire pour extrair des chaines de taille fixe qui sont concaténés
    2)les rediriger vers un autre fichier de sortie

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    comme précédemment, mais dans une boucle :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var="15/01/1016/01/1017/01/1018/01/10"
    for (( i=0; i<${#var}; i+=8))
    do echo "${var:i:8}"
    done
    15/01/10
    16/01/10
    17/01/10
    18/01/10


    PS: pense à mettre tes précédentes questions en "résolu"; bien sûr, si tu estimes qu'elle le sont...

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    merci monsieur
    en fait quand j'ai tapé le code ça c bien produit comme je l'ai voulu mais lorsque j'ai voulu l'écrire dans un script shelle je l'ai copié tel que votre méthode mais ça pas marhcé
    voila e quie j'ai écrit
    #!/bin/sh
    var="15/01/1016/01/1017/01/1018/01/10"
    for (( i=0; i< ${#var}; i+=8))
    do echo "${var:i:8}"
    done
    et ce qu j'ai eu come résultat
    line 3: Syntax error: Bad for loop variable

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    oui, j'aurais dû préciser que je ne travaille qu'en bash ! (je n'ai pas trouvé de vrai Bourne shell sur Debian GNU/Linux)
    sh ne connait pas les C-style for-loop (je crois)

    et comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/sh
     
    var="15/01/1016/01/1017/01/1018/01/10"
    i=0
    while [ $i -lt ${#var} ]
    do echo "${var:i:8}"
       let i="i+8"
    done
    ...
    ?

    PS: STP, utilise les balises 'CODE' (bouton #)

  5. #5
    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 : 61
    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
    On peut utiliser la commande sed également, soit à appliquer sur un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\(.\{8\}\)/\1\n/g' fichier_in > fichier_out
    soit sur une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newVar=$(echo $var | sed 's/\(.\{8\}\)/\1\n/g')

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    tout à fait, jmelyn !
    vue la concentration sur mon site http, je crois que je vais virer httpd, et finalement laisser un serveur HTTP en bash


    ...je garde l'impression que le script d'haithem20080 part en lacets...
    ?

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Merciiiiiiiiiiiiiiiiiiii pour tout votre aide depuis que je suis au furum

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Messieurs , je rencontre un petit problème concernant le script que Mr N_BaH m'as aidé de l'avoir
    en effet quand j'exécute le scipt donnée par monisuer N_BaH s'affiche sur mon ecran
    Bad substitution in line 8 ((la ligne ou se trouve la fin de boucle Done))
    pourriz vous m'expliquez ou se trouve l'erreur?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    Bonjour haithem*,

    quel shell utilises-tu ?
    et quelle distro ?

    dans tes scripts, pour que bash soit utilisé, le shebang doit être :
    #!/bin/bash
    ceci n'est pas anodin!

    sans shebang, c'est le shell courant qui sera utilisé.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Monsieur, j'utilise la distribution ubuntu dans sa version 8.04 donc le shell est celui associé à cette distribution

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    n'utilisant pas Ubuntu, "fût un temps où" Ubuntu utilisait dash comme shell par défaut, c'est sans doute encore le cas...

    éventuellement, regarde sur quoi pointe /bin/bash :
    ls -l /bin/bash

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Merci monsieur
    en effet ça marché à merveil quand j'ai rempalé sh bar bash dans mon script
    Monsieur , si maintenant la struture se trouve dans un fichier et se repète pèriodiquement
    par exemple j'ai dans le fichier s'appellant monfichier
    j'ai ceci
    01/01/1002/01/1003/01/1004/01/10 ...... (avec x=8 dans nitre cas )
    comment ferai-je pour récuprérer les strucutres séparés ? est ce que je procède de meme comme le cas d'une seule variable ?
    AMICALEMENT

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 482
    Points
    19 482
    Par défaut
    s'il te plait (même si ça ne te plaît pas), affiche tout le script que tu as rédigé jusqu'à maintenant !

    pour l'instant, nous, ici, on travaille dans le flou...
    (je n'entre pas dans des considérations du style :
    manque de confiance en lui
    manque de confiance en nous
    manque de confiance dans les lecteurs
    )
    parce que je suis à peu près sûr, que depuis le début, tu es parti sur de mauvai(e)s bases/pré-supposés...

    réfléchis/observe... : comment le ferais-tu "à la main" ?

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    d'accord monsieur
    je vais vous détailler tout le problème
    en effet , je travaille sur un dispositif de pointage . ce dispositif me renvoient les données de pointage du personnel ou des employés , les données d'une personne sont ecrit chacun sur 64 caractères comme ecrit ci desosus
    110110112530haithem
    c'est à dire à le 11 janvier 2010 à 11h25min30s haithem à accéder à une salle
    les données en effet m'arrive dans le fichier rapport.log qui emmagasiné dans le dispositif de pointage sont concaténés les uns après les autres : par exemple
    110110112530haithem110110112550edouard110110113030muriel110110112530samuel

    la structure d'une ligne contenant les donné de poitange d'une seul personne est dtaille fixe (64 caractère )

    c'est pour ca que je vous ai posé pour la prémière fois une question qui concerne une structure périodique dans le cas général dans une variable puis dans un fichier afain que je puisse rendre mon travail plus séquentiel

    j'espère monsieur que vous avez trouvé les explications clair et net
    Amicalement

  15. #15
    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 : 61
    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
    Je vais mettre mon grain de sel.

    D'abord, il serait bon d'utiliser les balises pour rédiger les messages, notamment la balise CODE (chez moi un bouton avec le caractère #). Les messages seront plus lisibles, les caractères plus faciles à compter.

    Ensuite, je ne vois pas 64 caractères pour une personne mais un nombre variable, suivant la taille du nom. Il faudrait être plus précis et donner un vrai exemple avec le nombre de caractères réel.

    Pour la solution, il faudrait faire des enregistrements (lignes) puis les découper en champs (date, heure, nom) et enfin trier les lignes suivant un critère (la date ou le nom). Sans doute une commande awk suivie d'un sort et ce devrait être bon...

  16. #16
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    # pour le taille de 64 caractères , je vais vous eclaircir les choses en effet, passant d'une date ou d'unévènement à un autre et dont le but d'avoir 64 caractères par evènements , la machine me fait sortir les données restant comme des zéros pour remplir jusqu'à la taille de 64
    par exemple
    110110112530haithemboughalmi000000000000000000000000000000000000110110133530jeanpierregaute00000000000000000000000000
    c'est à dire la machine me fait sortir les données utiles pour chaque personne avec les caractères de remplissage de pour arriver à 64 caractères
    c'est pour cela je me suis posé la question depuis le début pour extraire une strucutre périodique de taille fixe dans le cas d'une variable. Mr N_BAH m'as bcp aidé , donc il me reste le cas d'extraire les structure de taille fixe (64 caractèrre dans mon cas ) puis je vais les rediriger dans un autre fichier ou je vais faire le traitement

  17. #17
    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 : 61
    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
    D'accord, c'est plus précis maintenant. Une question encore: Il n'y a qu'une seule ligne dans le fichier de départ? Ou bien il est coupé d'une manière précise (3x64 par exemple)? Ou alors il est coupé n'importe comment (243 caractères la première ligne, 18 la seconde, 767 la troisième...)?

    Je ne pense pas pouvoir répondre aujourd'hui. Sans doute demain matin...

  18. #18
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    #en répondant a votre question ,
    le fichier est rempli d'une façon que tout les données sont concaténèes
    quand vous ouvrez le fichier vous allez trouver que chaque ligne du fichier et de taille fixe comportant 3 évènement (c à d chaque ligne compte 3*64 caractères concaténés)
    donc jai les étapes dans ma téte :
    1)c'est de trouver une méthode, une commande ou une fonntion d'extraire du fichier des strucuture de taille fixe (64 caractères ) et ceux pour tous le texte du fichier
    2) de rediriger ses lignes dans un second fichier

    3) prendre le nouveau fichier ligne par ligne et le traiter ( la date sera de la forme jj/mm/aa puis l'heure est de la forme hh:mm:ss et insérer les caractère de séparation
    4)rediriger chauqe ligne vers un troisième fichier qui s'agit du produit final de mon travail

    et ce mois et mon premier mois en développement en script shell donc je suis tout a fait débutant et c'est piour ça je pose bcp de questions pour apprendre plus de commande

  19. #19
    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 : 61
    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
    Bonsoir,

    Si j'ai bien compris, la commande suivante devrait faire le travail:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    awk '
    {
      for (i=0; i < 3; i++)
      {
        r=substr($0, i*64+1, 64)
        sub("0*$", "", r)
        printf "%s/%s/20%s ", substr(r, 1, 2), substr(r, 3, 2), substr(r, 5, 2)
        printf "%s:%s:%s ", substr(r, 7, 2), substr(r, 9, 2), substr(r, 11, 2)
        print substr(r, 13)
      }
    }' fichier_in > fichier_out
    C'est une simple commande awk, il n'y a pas de tri.

Discussions similaires

  1. extraction dans une chaine "qui varie"
    Par sofiane_bfm007 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 12/10/2010, 11h53
  2. Extraction d'une chaine avec séparateurs
    Par kaceo dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/05/2006, 11h36
  3. insertin d'une chaine qui contient des guillemets
    Par karimspace dans le forum Access
    Réponses: 7
    Dernier message: 13/02/2006, 12h55
  4. extraction d'une chaine de caractere ...
    Par nicolasghaz dans le forum VBScript
    Réponses: 7
    Dernier message: 31/10/2005, 19h53
  5. Extraction d'une chaine de caractères
    Par megane dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2004, 15h52

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