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 :

Parcours d'un fichier en sautant des blocs de lignes


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 52
    Par défaut Parcours d'un fichier en sautant des blocs de lignes
    Bonjour à tous,

    Je cherche à écrire un code qui me permet d'aller récupérer certaines informations dans un fichier à certaines lignes précises. Je cherche sans succès la fonction qui me permet de me positionner trois lignes après la position courante par exemple.

    En gros, voici l'algo du programme :
    Ouvrir le fichier
    Se positionner à la troisième ligne
    Récupèrer une chaine de caractères
    Se positionner à la 9èm ligne
    Récupèrer une nouvelle chaine de caractères
    Se positionner à la première série de délimiteurs
    Recommencer la boucle

    Si quelqu'un a une idée, je suis preneur.

    Cordialement,

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je ne suis pas sur d'avoir compris à quoi servait la recherche de délimiteur, mais si c'est pour identifier un nouveau bloc où il faudra chercher la 3e et 9e ligne, ceci devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $bloc_line = $.;
    while (<>) {
      if ($. == $bloc_line + 2) {
        # Récupèrer une chaine de caractères
      }
      if ($. == $bloc_line + 3) {
        # Récupèrer une nouvelle chaine de caractères
      }
      if (/delimiter/) {
        $bloc_line = $.;
      }
    }

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 52
    Par défaut
    si c'est pour identifier un nouveau bloc où il faudra chercher la 3e et 9e ligne,
    ==> C'est exactement ça. J'ai incorporé le code que tu as donnée, mais j'ai l'impression qu'il pars dans une boucle infinie, il me manque un truc.

    Voici le code actuel :
    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
     
    while(defined(my $fic=readdir REP)){
      my $f="${rep}/$fic";
      if($fic=~/.*\.txt/){
        open FIC, "$f" or warn "$f E/S: $!\n";
    	$bloc_line = $.;
    	while (<>) {
    	  if ($. == $bloc_line + 3) {
    		# Récupèrer une chaine de caractères
    		print $.;
    	  }
    	  if ($. == $bloc_line + 9) {
    		# Récupèrer une nouvelle chaine de caractères
    		print $.;
    	  }
    	  if (/==================================================/) {
    		$bloc_line = $.;
    	  }
    	}	
        close FIC;
      }
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Remplace la ligne
    par
    (au minimum).
    N'ayant pas donné de code source, j'ai pris la liberté de faire un code générique qui traite par défaut la liste des fichiers fournis en paramètre (opérateur <>).

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 52
    Par défaut
    Ça marche mieux, effectivement.
    Par contre, le + n'est pas compris correctement (addition au lieu d'un déplacement):
    Use of uninitialized value in addition (+)
    J'ai essayé de me servir de la commande seek pour me déplacer dans le fichier, sans succès. D'après ce que j'ai pu voir, il me suffit de faire :

    pour sauter trois lignes, mais il reste sur un saut de trois caractères.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par mverhaeghe Voir le message
    Ça marche mieux, effectivement.
    Par contre, le + n'est pas compris correctement (addition au lieu d'un déplacement):
    Le + est très bien compris. C'est juste qu'une des valeurs ajoutée n'est pas définie correctement.
    Le principe de l'algo est le suivant :
    - ouvrir le fichier
    - initialiser le numéro de ligne du début du bloc avec le numéro de ligne du fichier
    - boucler sur toutes les lignes
    + si le numéro de ligne courante est égal au numéro de ligne du début de bloc + 2 (et non pas 3), alors je suis sur la 3e ligne du bloc
    + si le numéro de ligne courante est égal au numéro de ligne du début de bloc + 8 (et non pas 9), alors je suis sur la 9e ligne du bloc

    Je vais essayer de voir ce qui ne fonctionne pas avec ton script, mais il serait bon que tu repostes le nouveau code corrigé pour que je soit sur d'utiliser le bon.
    J'ai essayé de me servir de la commande seek pour me déplacer dans le fichier, sans succès. D'après ce que j'ai pu voir, il me suffit de faire :

    pour sauter trois lignes, mais il reste sur un saut de trois caractères.
    La commande seek positionne le pointeur de fichier avec un indice en "octet" pas en nombre de ligne. Oublie son usage rapidement pour un fichier texte.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/09/2011, 09h59
  2. Réponses: 4
    Dernier message: 07/12/2010, 10h36
  3. Ecrire dans un fichier en sautant des lignes
    Par quefets dans le forum Langage
    Réponses: 4
    Dernier message: 20/11/2008, 15h28
  4. Réponses: 3
    Dernier message: 05/11/2007, 15h25
  5. Réponses: 3
    Dernier message: 11/06/2007, 11h20

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