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

Algorithmes et structures de données Discussion :

Parser du fichier texte


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 48
    Points : 25
    Points
    25
    Par défaut Parser du fichier texte
    Bonjour tout le monde,

    Si je veux parser du texte comme celui-ci :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    c1-\tweak #'X-offset #-10 ^\markup {
        \score {
          \new StaffGroup<<
            \override StaffGroup.SystemStartBracket.transparent = ##t
            \new ChordNames {
                  \set minorChordModifier = \markup { "-" }
                  \set chordNameSeparator = \markup { ""}  
                  \set majorSevenSymbol = \markup { M7 }
                  \set chordNameExceptions = #chExceptions
                  \override ChordName #'font-size = #-1
                  \override ChordName #'font-series = #'bold
     
    \transpose c c <c e g >2.
    \transpose c bes <c e g bes a' >4
    
      
      
    }
            
            
            \new Staff \relative c' { \override Staff.TimeSignature #'stencil = ##f \override Staff.TimeSignature #'stencil = ##f 
                                                   \override Stem #'transparent = ##t
                                                   \clef "treble"
                                      <e >4^\markup {\musicglyph #"scripts.downbow" 
                                                          }
                                      \override NoteHead.color = #(x11-color "DarkRed")
                                      \override Accidental.color = #(x11-color "DarkRed")
                                      <c g' c e >
                                      \bar "!"
                                      <d aes' d g >
                                      \override NoteHead.color = #(x11-color "Black")
                                       \override Accidental.color = #(x11-color "Black")
                                       \override Accidental.color = #(x11-color "Black")
                                      <d f >^\markup {\musicglyph #"scripts.upbow" 
                                                          }
                                      \bar "|"
            }
            \new Staff \relative c' { \override Staff.TimeSignature #'stencil = ##f \override Stem #'transparent = ##t  \clef "bass" 
                                      <c,, e c' g' >4
                                      \override NoteHead.color = #(x11-color "DarkRed")
                                      \override Accidental.color = #(x11-color "DarkRed")
                                      s4
                                      s
                                      \override NoteHead.color = #(x11-color "Black")
                                       \override Accidental.color = #(x11-color "Black")
                                      <d f bes' >}
          >>
        \layout { }
        }
      }
    %cell 3
    c1-\tweak #'X-offset #-10 ^\markup {
        \score {
          \new StaffGroup<<
            \override StaffGroup.SystemStartBracket.transparent = ##t
            %accords
             \new ChordNames {
                  \set minorChordModifier = \markup { "-" }
                  \set chordNameSeparator = \markup { ""}  
                  \set majorSevenSymbol = \markup { M7 }
    }
    Je recherche dans ce texte les éléments contenus entre les chevrons ouvrants et fermants par exemple : <e c f>.
    Mais plus compliqué, je recherche aussi une lettre comme le s ou s4 par exemple

    Si quelqu'un peut m'aider

    Merci

  2. #2
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ grep -o '<[^>]*>' chevrons_exemple.txt
    <c e g >
    <c e g bes a' >
    <e >
    <c g' c e >
    <d aes' d g >
    <d f >
    <c,, e c' g' >
    <d f bes' >
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -o '<[^>]*>' chevrons_exemple.txt | grep s
    <c e g bes a' >
    <d aes' d g >
    <d f bes' >
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -o '<[^>]*>' chevrons_exemple.txt | grep 's4'
    $
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 48
    Points : 25
    Points
    25
    Par défaut
    Merci pour cette superbe réponse.
    Mais j'ai oublié de préciser que je cherche les contenus entre les chevrons ouvrants et fermants que si ce contenu est dans le bloc "clef treble" ou "clef bass"

    (Je vais mettre en gras les blocs )
    Car il peut y avoir du bruit, c a d qu'il peut y avoir des <a b d > en dehors des blocs (treble ou bass)

    Merci par avance.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ sed -n '/\\clef/{s/.*clef "\([^"]*\)".*/\1/;h;}; s/.*\(<[^>]*>\).*/\1/;G;s/\(.*\)\n\(.*\)/\2 \1/;/<.*>/p;' chevrons_exemple.txt
     <c e g >
     <c e g bes a' >
    treble <e >
    treble <c g' c e >
    treble <d aes' d g >
    treble <d f >
    bass <c,, e c' g' >
    bass <d f bes' >
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed -n '/\\clef/{s/.*clef "\([^"]*\)".*/\1/;h;}; s/.*\(<[^>]*>\).*/\1/;G;s/\(.*\)\n\(.*\)/\2 \1/;/<.*>/p;' chevrons_exemple.txt | grep treble
    treble <e >
    treble <c g' c e >
    treble <d aes' d g >
    treble <d f >
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 48
    Points : 25
    Points
    25
    Par défaut
    Merci pour cette réponse.

    J'ai une dernière question . A partir de cette regex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/\\clef/{s/.*clef "\([^"]*\)".*/\1/;h;}; s/.*\(<[^>]*>\).*/\1/;G;s/\(.*\)\n\(.*\)/\2 \1/;/<.*>/p;' chevrons_exemple.txt
    Comment faire pour accepter aussi les s (que je vais mettre en gras, et qui doivent etre soit dans le bloc treble soit dans le bloc bass) et ne pas accepter les strings par exemple <a b f > si elles sont précédées du mot \transpose?


    Merci par avance.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Le script lit le texte, ligne à ligne.
    Quand la clef est redéfinie, il écrit la clef en début de toutes les lignes suivantes.
    Le filtre des chevrons n'arrive qu'à la fin.
    /<.*>/p;-> Si il y a dans la ligne au moins une paire de chevrons, alors écrire la ligne.

    Il suffit de rajouter une instruction pour s et s4.
    Pour ne pas qu'il sélectionne "saucisson" ou "finis4", on ajoute les signes de début-de-mot \< et fin-de-mot \>:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ sed -n '/\\clef/{s/.*clef "\([^"]*\)".*/\1/;h;}; s/.*\(<[^>]*>\).*/\1/;G;s/\(.*\)\n\(.*\)/\2 \1/;/<.*>/p;/\<s4\?\>/p' chevrons_exemple.txt                                                                                                                     
     <c e g >
     <c e g bes a' >
    treble <e >
    treble <c g' c e >
    treble <d aes' d g >
    treble <d f >
    bass <c,, e c' g' >
    bass                            s4
    bass                            s
    bass <d f bes' >

    Pour disqualifier une ligne, il faut la détruire avant de l'afficher.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/\\clef/{s/.*clef "\([^"]*\)".*/\1/;h;}; /\\transpose.*<a f e>/d; s/.*\(<[^>]*>\).*/\1/;G;s/\(.*\)\n\(.*\)/\2 \1/;/<.*>/p;/\<s4\?\>/p' chevrons_exemple.txt
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 48
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup Flodelarab pour cette réponse, c'est tout simplement ce qu'il me fallait.Et ceci en une seule ligne de code !

    Je marque comme résolu.Et merci encore.

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

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