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 :

Récupération d'informations sur plusieures lignes


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 72
    Points : 39
    Points
    39
    Par défaut Récupération d'informations sur plusieures lignes
    Bonjour
    je tentes de récupérer plusieurs informations dans un fichier texte, afin de modifier un autre fichier. Voila le fichier sur lequel je veu récupérer mes données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dn: cn=jean mich,mail=jeanmich@hotmail.com
    objectclass: top
    objectclass: person
    objectclass: organizationalPerson
    objectclass: inetOrgPerson
    objectclass: mozillaAbPersonAlpha
    givenName: mich
    sn: jean
    cn: jean mich
    mail: jeanmich@hotmail.com
    J'essaye de récupérer ce qui est après givenName:, et après sn :.
    Je voulais savoir si c'était possible en parcourant 1 seule fois le fichier

    Voici une partie du code que j'ai écris, et vous vous en doutez, ca marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while (my $donnees = <$fic>){
    	chomp ($donnees);
    	my $prenom =~ /givenName:/"([^\"]+)";
            my $sn =~ /sn:/"([^\"]+)";
             my $new_ldif = $ldif;
    	$new_ldif =~ s/prenomaremplacer/$prenom/g;
    	chomp ($new_ldif);
        print $ldif_out $new_ldif;
        #print "$new_ldif\n";
    }
    close $ldif_out;
    close $fic;
    Je sais que l'erreur vient de la regex, mais je vois pas trop comment il faut l'écrire

    Merci de votre aide ...

  2. #2
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Oui en effet tes expressions regulieres c'est pas trop ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    my $prenom = "";
    my $sn ="";
    if ($donnees  =~ /^givenName:(\w+)/ ){  #remplace \w+ par [^\"]+ si tu veux pas les "
        $prenom = $1;
    }
    elsif ($donnees  =~ /^sn:(\w+)/ ) {
        $sn = $1;
    }
    Science sans conscience n'est que ruine de l'âme

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 72
    Points : 39
    Points
    39
    Par défaut
    Merci, ca parait si logique 1 fois écrit
    J'avais commencé à les réecrire et j'étais plus très loin du bon résultats

    Maintenant g un autre petit problème, peut etre que tu pourras m 'aider Minus ^^
    J'essaye de remplacer le texte que je récupère dans un fichier modèle.
    Voila a quoi ca ressemble :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dn: uid=uidacreer,ou=groupearemplacer,ou=carnets,dc=ifremer,dc=fr
    objectclass: top
    objectclass: extensibleObject
    groupeunix : groupearemplacer
    givenName: prenomaremplacer
    sn: nomfamillearemplacer
    et voila le code que j'utilise pour la subsitution :
    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
    my $fichier_uploader = "Oli.ldif";
    my $ldif_src_filename = "./modeles/modele.ldif";			
    my $ldif_out_filename = "insertion.ldif";									
     
    open my($fic), '<', $fichier_uploader
        or die "Impossible de lire le fichier $fichier_uploader : $!\n";
    open my($ldif_src), '<', $ldif_src_filename
        or die "Impossible de lire le fichier $ldif_src_filename : $!\n";
    open my($ldif_out), '>', $ldif_out_filename
        or die "Impossible de lire le fichier $ldif_out_filename : $!\n";
     
    my $ldif = do { local $/; <$ldif_src> };
    close $ldif_src;
     
    while (my $donnees = <$fic>){
    	chomp ($donnees);
    	my $groupe_unix = "ditiric";
    	my $prenom = "";
    	my $sn ="";
    	my $new_ldif = $ldif;
     
    		if ($donnees  =~ /^givenName:([^\"])/ ){
    			$prenom = $1;
    		}		
    		elsif ($donnees  =~ /^sn:([^\"])/ ) {
    			$sn = $1;
    		}
     
    	$new_ldif =~ s/prenomaremplacer/$prenom/;
    	$new_ldif =~ s/nomfamillearemplacer/$sn/;
        $new_ldif =~ s/groupearemplacer/$groupe_unix/g;
     
    	chomp ($new_ldif);
        print $ldif_out $new_ldif;
        print "$new_ldif\n";
    }
    close $ldif_out;
    close $fic;
    je comprends pas pourquoi lorsque j execute mon script, il n'y a rien après le champ givenname.
    J espere que je suis assez clair ^^
    Merci en tout cas, grace a toi, je peux avancer un peu

  4. #4
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    A mon avis car tu a oublié le * apres [^\"].
    En fait [] sert a detecter un seul et unique caractere... donc il matche surrement sur un espace ou une connerie comme ca.

    Apres je suis pas très sur de ton utilisation des fichiers pour la sortie ...
    Science sans conscience n'est que ruine de l'âme

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 72
    Points : 39
    Points
    39
    Par défaut
    Il me manquait bien l'étoile
    je me suis rendu compte que ma boucle while etait bien mauvaise, vais corriger ca vite fait

    merci en tout cas, c tres sympa de ta part de m'avoir aidé !
    a bientot !!

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par minus
    Apres je suis pas très sur de ton utilisation des fichiers pour la sortie ...
    Le style des open() et filehandles qu'il utilise ici est le meilleur possible actuellement du point de vue sûreté et efficacité (son code est en fait l'une de mes réponses précédentes à laquelle il a rajouté des choses).

    Explication :
    1. Les filehandles lexicaux $fh sont plus sûr que l'utilisation des glob *FH dans ce rôle pour plusieurs raisons (dont le fait qu'ils ne risquent pas d'entrer en conflit avec un autre glob du même nom dans une fonction du même module) et plus efficace (on peut facilement utiliser le style OO sur eux pour faire la plupart des opérations courantes, mais surtout ils se ferment automatiquement dès qu'on a plus de référence sur eux).
    2. Le open() à 3 arguments évite bien des risques du open à 2 arguments (t'es tu jamais demandé ce qu'il advenait si tu ouvrais un fichier nommé ">monfichier" avec un open à 2 arguments qui profite du fait que "par défaut" les fichiers sont en mode lecture ? Ce n'est qu'un simple exemple des choses qui peuvent mal tourner).


    --
    Jedaï

  7. #7
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    C'est pas ce que je voulais dire Jedai

    Je trouvais que son code n'etait pas très clair lors de la mise en memoire puis de l'ecriture.

    Mais merci pour le open a 3 arguments, je ne m'etais en effet jamais posé cette question ... ca m'evitera surrement de mauvaises surprises
    Science sans conscience n'est que ruine de l'âme

Discussions similaires

  1. [DATA] Réunir information sur plusieures lignes en une seule ligne
    Par philippeadp dans le forum SAS Base
    Réponses: 1
    Dernier message: 25/10/2011, 16h03
  2. Réponses: 10
    Dernier message: 02/09/2010, 09h19
  3. Réponses: 2
    Dernier message: 02/05/2007, 17h08
  4. [MySQL] Checkboxes : récupérer les informations sur plusieurs lignes
    Par eric41 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 12/06/2006, 12h41
  5. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45

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