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

Langage Perl Discussion :

aide parsing de fichiers


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Février 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut aide parsing de fichiers
    alors, j'ai besoin d'un peu, et de beaucoup d'explication pour un script que je doit faire (et bien entendu je n'y connais rien en perl , enfin si un peu)
    j'ai un repertoire contenant des fichiers avec le même template que voici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    NIMPORTEQUOI
    1
     1.1
        1.1.1
    2
     2.1
       2.1.1
             toto  :    1   :  [ ]
                          2   : [ ]
    alors je doit parser l'ensembles des fichiers et recuperrer le nom du fichier,la premiere ligne et le contenu d'un de paragraphes (entre 2.1 et 2.1.1 mais pas les lignes 2.1 et 2.1.1)
    seulement si toto 1 ou toto 2 sont cochés (un x entre [ ]) et mettre c'est information dans un csv

    ou est ce que j'ai besoin d'aide:
    J'ai déjà reussi à recuperrer en 'shell' avec un grep la liste des fichiers que je doit parser, la premiere ligne.
    mais la ou je but c'est recuperrer le praragraphe. j'ai essayer avec sed
    sed -en"/^\s2.1/,/^2..1.1/p", mais cela ne marche et comme reponse d'aide j'ai fait cela en perl cela te prend 2 minutes

    bon j'ai déjà recupperrer 2/3 scirpt mais il ne font pas exactement ce que je veux ils prennent tous le paragraphes + les lignes 2.1 et 2.1.1
    Donc voila je solicite votre aide
    Bon comme c'est un peu long si voulez mais script je l'ai mettrais mais je ne suis pas encore padwan en programmation tous cours donc c'est des copir/coller de ce même forum

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 42
    Points : 47
    Points
    47
    Par défaut
    Hello jeune Paddawan

    Le code ci-dessous est un peu long, mais il fait son office à mon avis...

    N'hésite pas si tu as des questions...

    Pour l'exécuter sous unix:
    cat <NomDeFichier> | perl <NomDuScript.pl>
    sous win:
    type <NomDeFichier> | perl <NomDuScript.pl>

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
      sub trim {
        my ( $sString ) = @_;
     
        $sString =~ s/^\s*([^\s]?.*[^\s]?)\s*$/\1/;
        return $sString;
      }
     
      # On ne connait pas la premiere ligne
      $sFirstLine = "";
      # Pas plus que le numero de paragraphe courant
      $sParagraphNumber = "";
      # Tant qu'on arrive a lire l'entree standard
      while ( defined($sLine = <STDIN>) ) {
        # On vire les retours chariot de la ligne lue
        $sLine =~ s/(\r|\n)/g;
        # On vire les espaces à gauche et a droite de ladite ligne
        $sLine = trim($sLine);
        # On zappe les lignes vides
        next if ( $sLine eq "" );
        # Si la premiere ligne n'est toujours pas connue
        if ( $sFirstLine eq "" ) {
          # On la connait maintenant
          $sFirstLine = $sLine;
          # Et on passe au tour de boucle suivant
          next;
        }
        # Si on trouve un numero de paragraphe
        if ( $sLine =~ /^[0-9\.]+$/ ) {
          # On en prend note
          $sParagraphNumber = $sLine;
          # On vide le nom de la variable du paragraphe precedent
          $sVariableName = "";
          # Et on passe au tour de boucle suivant
          next;
        }
        # Si on trouve une ligne du style "variable:numero:[ |X|x]"
        if ( $sLine =~ /^([^:]+):\s*([0-9]+)\s*:\s*\[([\sxX])\]$/ ) {
          # On prend note du nom de la variable
          $sVariableName = trim($1);
          # Du numero associe
          $nRank = $2;
          # Et du drapeau d'affichage
          $sDisplayFlag = $3;
        # Sinon si on trouve une ligne du style "numero:[ |X|x]"
        } else if ( $sLine =~ /^([0-9]+)\s*:\s*\[([\sxX])\]$/ ) {
          # On prend note du numero
          $nRank = $2;
          # Et du drapeau d'affichage
          $sDisplayFlag = $3;
        # Sinon (format de ligne inconnu au bataillon)
        } else {
          # Et on passe au tour de boucle suivant
          next;
        }
        # On passe au tour de boucle suivant si l'affichage de la variable n'est pas requis
        next if ( $sDisplayFlag !~ /x/i );
        # Si le numero de paragraphe n'est pas connu (variable trouvee avant la declaration d'un paragraphe)
        if ( $sParagraphNumber eq "" ) {
          # On indique l'erreur
          printf STDERR ("#ERROR: found variable '%s', rank %d to display with unknown paragraph\n", $sVariableName, $nRank);
          # Et on passe a la ligne suivante
          next;
        }
        # Si on trouve un nom de variable vide (aucune variable déclarée dans le paragraphe avant de tomber sur une chaine du style "nombre:[ |x|X]")
        if ( $sVariableName eq "" ) {
          # On indique l'erreur
          printf STDERR ("#ERROR: found unknown variable with rank %d to display in paragraph %s\n", $nRank, $sParagraphNumber);
          # Et on passe a la ligne suivante
          next;
        }
        # A ce stade, on a trouve des informations qui doivent être affichées
        printf("#INFO: found variable '%s' with rank %d in paragraph '%s'\n", $sVariableName, $nRank, $sParagraphNumber);
      }
    Tiens nous au courant

    PluX59

Discussions similaires

  1. [C++] Menu d'aide: ouvrir un fichier texte
    Par debutanteVB.NET dans le forum C++
    Réponses: 11
    Dernier message: 15/12/2005, 23h12
  2. [XML-XSLT] Exécution à l'aide d'un fichier .bat
    Par Hoegaarden dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 16/08/2005, 15h18
  3. Besoin d'aide lié à un fichier xml et un tableau a charger..
    Par jjs dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/07/2005, 14h03
  4. Réponses: 7
    Dernier message: 26/07/2005, 16h31
  5. besoin d'aide fonction avec fichier (debutant)
    Par boby61 dans le forum Débuter
    Réponses: 9
    Dernier message: 14/03/2005, 11h22

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