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 :

Shell Parser fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 83
    Par défaut Shell Parser fichier
    Bonsoir à tous,

    Voilà depuis quelques heures que je cherche désespérément à savoir comment parser un fichier via en script ksh.

    Mon fichier d'entrée est le suivant :

    ++
    CATEGORIE 1

    ==
    Sous catégorie 1

    aaa
    bbb
    cc

    ==
    Sous catégorie 2

    dd
    ffff
    yyy

    ++
    CATEGORIE 2
    ...
    J'aimerai donc bien pouvoir récupérer les différentes parties de mon fichiers.

    Exemple Catégorie1= CATEGORIE1
    ss_catgorie1=aaa
    bbb
    ccc

    etc...
    Je viens donc quémander votre aide cher développeur.

    En vous remerciant,

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    comment parser un fichier via en script ksh
    de la même manière qu'en bash probablement; regarde ici...

    Après, ton plus gros problème est de décider quelle action effectuer selon que la ligne lue vaut tant ou tant.

    tu as peut-être déjà pensé à quelque chose
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 83
    Par défaut
    Bonjour N_BaH,

    J'avais bien vu ton post, mais mon problème vient du fait qu'il n'est pas obligatoire que j'aie de sous catégories dans mon fichier :/
    Peut-être faut-il penser à un autre manière de délimiter mes fichiers?

    Effectivement, j'ai pensé à l'utilisation du awk.
    Je décompose mes CATEGORIE en plusieurs fichiers via la commande :

    file='categorie.log'
    awk '/^"++"/{close f; f=""} f{print > f} /^"++"/{f="doc."++d}' ${file}
    Sauf que cette commande ne fonctionne pas avec des caractères spéciaux que j'ai choisi pour délimiter mes catégories (++) . En effet, avec un BEGIN - END à la fin de chaque CATEGORIE cela pourrait fonctionner.

    Ma question : Cela pourrait-il fonctionner avec caractères spéciaux?

    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/ksh
     
    while read line
    do [ "$line" = "++" ] && output="doc.$((++n))"
       echo "$line" >> "$output"
    done < ton_fichier.log
    cela pourrait-il être tout ce que tu demandes ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 83
    Par défaut
    Bonsoir N_BaH,

    Effectivement, cela pourrait coller, comme quoi il ne fallait pas chercher trop loin.
    Afin de faciliter le parsing du fichier j'ai décidé de modifier le contenu du fichier

    ++ categorie 1
    aa bb cc
    aa bb cc

    ++categorie 2
    = sous categorie 21
    aa aa
    bb bb

    = sous categorie 22
    cc dd
    Je te fais part de l'algorithme général que je compte apporter grâce à ton aide:

    1 - Découpe du fichier log en plusieurs doc.* correspondant aux catégories
    2 - parcourir chaque doc.* pour en extraire les variables.
    a. pour tous les fichiers doc.* lecture ligne à ligne
    b. si deux premiers caractères = "++" alors v_CATEGORIE=ligne
    c. si deux premiers caractères = "=" alors v_SS_CATEGORIE=ligne
    d. sinon cela correspond au données

    ce qui donne pour l'instant :

    while read line
    do [ "${line:0:2}" = "++" ] && output="doc.$((++n))"
    echo "$line" >> "$output"
    done < monfichier.log




    j=0
    k=0
    while read line
    do
    if [ "${line:0:2}" = "++" ] ; then
    data=""
    varsc=""
    k=0
    let j=$j+1
    typeset categorie$j="$line"


    elif [ "${line:0:1}" = "=" ] ; then
    data=""
    let k=$k+1
    varsc=$j"_"$k
    typeset sscategorie${varsc}="$line"

    elif [ "${line:0:3}" != "" ] ; then
    typeset data="$data""$line
    "
    if [ "$varsc" = "" ];then
    typeset "data$j"="$data"
    else
    typeset "data$varsc"="$data"
    fi

    fi

    done < monfichier.log
    Peut-être que cette méthode est trop brouillon ?

    Dans l'attente de ton avis sur le sujet,

    Merci d'avance !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    c'est typeset pour déclarer des variables, et pas set

    J'aimerais bien savoir ce qui se passe en amont : le script qui produit ce log
    et pourquoi tu dois retraiter le log, plutôt que d'avoir un log dans le format que tu veux...

    d'ailleurs, quel est exactement le format voulu ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 83
    Par défaut
    Bonjour N_BAH,

    Pour être plus concret, voici ce qu'il se passe en amont:

    Un script SQL est exécuté. Celui-ci se présente ainsi :

    PROMPT ++ CATEGORIE
    PROMPT = SS_CATEGORIE

    select champs1, champs2, champs3 from table1 where table_name like %toto%;

    PROMPT = SS_CATEGORIE
    select champs1, champs2, champs3 from table2 where table_name like %toto%;

    PROMPT ++ CATEGORIE
    PROMPT = SS_CATEGORIE
    select champs1, champs2, champs3 from table2 where table_name like %toto%;
    ...
    Résultat possible dans la log:
    ++ CATEGORIE
    = SS_CATEGORIE

    aa bb cc
    cc dd ee

    2 rows selected.

    ++ CATEGORIE

    aa bb cc

    1 rows selected.

    ++ CATEGORIE
    ++ SS_CATEGORIE
    aa bb cc

    1 rows selected.
    J'aimerais donc récupérer l'ensemble de ces informations pour en créer un fichier html afin de mieux présenter la fichier Log.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Je pense à créer un fichier xml, d'abord :

    Code pseudo code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #tant que je lis une ligne du fichier.log
    #si la ligne commence par ++
    #alors
    #	si une balise ssKt a été ouverte je la ferme, et je supprime le drapeau afférent
    #	si une balise kT a été ouverte, alors je la ferme, et je supprime le drapeau afférent finsi
    #	j'ouvre une balise kT, et je valorise un drapeau kT
    #	j'écris la ligne
    #autresi la ligne commence par =
    #alors
    #	si une balise ssKt a été ouverte je la ferme, et je supprime le drapeau afférant
    #	j'ouvre une balise ssKt, et je valorise un drapeau ssKt
    #	j'écris la ligne
    #autre
    #	si la ligne n'est pas vide, et si la ligne ne commence pas par un chiffre
    #	alors
    #		j'ouvre une balise "unique" produit
    #		j'écris la ligne
    #	finsi
    #finsi
    ce qui donnerait, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <categorie id="CATEGORIE">
       <ss-categorie id="SSCATEGORIE">
          <produit id="PRODUIT"/>
       </ss-categorie>
    </categorie>
    un fichier xml, quoi...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. [DOM] Erreur parser fichier xml avec caractère spéciaux
    Par turcotm dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 19/06/2006, 09h01
  2. Réponses: 7
    Dernier message: 30/05/2006, 14h08
  3. parser fichier texte pour avoir un doc html !!
    Par avogadro dans le forum Débuter
    Réponses: 4
    Dernier message: 30/03/2006, 16h12
  4. [XML] [EXPAT] Parser fichier XML
    Par Ben42 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 17/02/2006, 14h08
  5. [XSL] Parser fichier xml : erreurs + incompréhensions
    Par totobouchon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/07/2005, 15h47

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