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 :

extraire les données avec saut de lignes


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut extraire les données avec saut de lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    open LIRE,"cheminvers le fichier" or die "E/S : $!\n";
    open ECRIRE,">cheminvers le fichier resultat\n", or die "E/S : $!\n";
     
    while(<LIRE>){ 
      print ECRIRE "ligne$. ",(split /\s/,$_)[44,45,46],"\n" if $. % 32 == 4; 
    }
    en fait ca marche mais il me manque qq choses


    en fait
    * je veux extraire a partir de la 4ieme ligne ( c'est bon)
    * extraire les 44, 45 et 46 ieme colonne du ligne en cours ( c'est bon)
    - si $44 == 60
    ligne++;
    extraire la colonne 6 et 7 ;
    ligne = ligne + 32;

    - sinon ligne =ligne +32;


    je serai tres reconnaissant si vous me trouver une solution
    merci d'avance

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par karim_khouja Voir le message
    en fait
    * je veux extraire a partir de la 4ieme ligne ( c'est bon)
    * extraire les 44, 45 et 46 ieme colonne du ligne en cours ( c'est bon)
    - si $44 == 60
    ligne++;
    extraire la colonne 6 et 7 ;
    ligne = ligne + 32;

    - sinon ligne =ligne +32;


    je serai tres reconnaissant si vous me trouver une solution
    merci d'avance
    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
    use strict;
    use warnings;
     
     
    open my $lire ,"cheminvers le fichier" or die "E/S : $!\n";
    open my $ecrire ,">cheminvers le fichier resultat\n", or die "E/S : $!\n";
     
     
     
     
    while( my $line = <$lire>){ 
     
    	my ($data_6, $data_7, $data_44, $data_45, $data_46);
     
    	if ($. >= 4){
     
    		($data_6, $data_7, $data_44, $data_45, $data_46) = (split /\s/, $line)[6, 7, 44, 45, 46]; 
     
    		if ($data_44 == 60){
    			# traitement 
    		}
     
                   # traitement 
     
    		$. += 32;
    	}
    }
    Pourquoi faire 2 fois l'extraction et donc 2 fois la même opération? N'est-ce pas mieux de récupérer toutes les colonnes dont tu pourrais avoir besoin en une seule fois quitte à en récupérer 2 de trop?

    Mon split ne fonctionne pas, mais l'idée de l'algo y est (apparemment tu as réussi à ne récupérer que certaines colonnes via un split). Sinon un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @data = split (/\s/, $line);
    $data[44],  $data[45],  $data[46]
    ... mais si tu arrives à ne récupérer que les valeurs dont tu as besoin c'est mieux.

    Il vaut mieux utiliser le filehandle $lire ainsi que la variable $. qui indique la ligne du fichier (à partir de 1)
    -- Jasmine --

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Ce qui donne avec ton if et en gardant $_ au lieu de $line
    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
    while(<lire>){ 
     
    	if($. % 32 == 4){
     
    		my ($data_6, $data_7, $data_44, $data_45, $data_46 ) = (split /\s/)[6, 7, 44, 45, 46];
     
    		if ($data_44 == 60){			
    			print $ecrire "ligne$. $data_44, $data_45, $data_46 \n"; 
    		}
    		else {
    			print $ecrire "ligne$. $data_6, $data_7, $data_44, $data_45, $data_46 \n"; 
    		}
     
    		$. += 32;
    	}
    }
    -- Jasmine --

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    merci bcp
    mais j'ai un séparateur de pipe "|" non pas l'espace?

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    remarque :
    ton code ne s'execute pas il contient bcp de fautes

    j'ai un bout de code qui execute mais tjr les condition if sont fausse!!!

    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
    # !/usr/bin/perl -w
     
    use strict;
    use warnings;
     
     
    open LIRE,"/home/sst/Bureau/karim/capture/karimov.txt" or die "fichier in trouvable";
    open ECRIRE,">/home/sst/Bureau/rtp.txt\n", or die "E/S : $!\n";
     
    while(<LIRE>){ 
    {
     
    print ECRIRE "ligne$. ",(split /\s/,$_)[45,46,47],"\n" if $. % 29 == 3; 
    if  ($_5 == '2') # a titre d'exemple
    $.++;
    print ECRIRE "ligne$. ",(split /\s/,$_)[2,3],"\n"  
    }
     
     }

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Pensez à utiliser les balises CODE s'il vous plait la prochaine fois : http://www.developpez.net/forums/d71...rum-perl-lire/

  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par karim_khouja Voir le message
    merci bcp
    mais j'ai un séparateur de pipe "|" non pas l'espace?
    Utilise un antislash devant le pipe
    -- Jasmine --

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Utilise des filehandle $ecrire et $lire, c'est mieux que ECRIRE et LIRE.


    j'ai un bout de code qui execute mais tjr les condition if sont fausse!!!
    Si $var est un nombre, n'utilise pas les quotes autour de 2

    Que doit contenir $_5? Est-ce valeur de l'array résultant du split dont l'indexe est 5?
    -- Jasmine --

  9. #9
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    En essayant de comprendre ce que tu veux faire
    print ECRIRE "ligne$. ",(split /\s/,$_)[45,46,47],"\n" if $. % 29 == 3;
    if ($_5 == '2') # a titre d'exemple
    $.++;
    print ECRIRE "ligne$. ",(split /\s/,$_)[2,3],"\n"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while( <$lire>){ 
     
    	my ($data_2, $data_3, $data_5, $data_45, $data_46, $data_47 ) = (split /\|/)[2, 3, 5, 45, 46, 47]; 
     
    	if ( ($. % 29 == 3) && (($data_5 == 2)) ){
     
    		print $ecrire "ligne$. $data_45 $data_46 $data_4\n";
    		$. += 2;
    		print $ecrire "ligne$. $data_2 $data_3\n"  
    	}
    }
    -- Jasmine --

Discussions similaires

  1. Extraire les données d'une image DICOM avec DCMTK
    Par li_la dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/05/2011, 19h01
  2. Réponses: 0
    Dernier message: 20/04/2010, 17h10
  3. extraire les données d'un fichier xml avec xmlspy
    Par mouna1 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/06/2009, 13h50
  4. Réponses: 0
    Dernier message: 22/04/2008, 01h24
  5. Réponses: 12
    Dernier message: 18/07/2006, 19h51

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