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 :

Problème pour modifier ordre des champs d'une ligne


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Problème pour modifier ordre des champs d'une ligne
    Bonjour,

    Je cherche à réorganiser un fichier texte de 1500 lignes que j'ai récupéré d'un pdf. Difficulté : les informations n'ont pas été saisies dans le même ordre pour chaque ligne.

    J'ai besoin d'avoir : Nom;Prénom;Date Naissance;Lieu naissance;Date décès;Date événement 1;Evenement 1;Date événement 2;Evénement 2; ... jusqu'à la fin de la ligne.

    Donc pour ne pas tout faire à la main, j'essaye d'apprendre à faire cela en perl mais pour un novice (quelques heures de tatonnements) ce n'est pas simple.

    J'ai réussi à récupérer la date de décès et à ranger les premiers champs dans le bon ordre. Comment faire pour ranger les suivants, tout en enlevant le champ "DCD le ..." de son emplacement d'origine pour qu'il ne figure pas deux fois dans la ligne ? J'avoue que je sèche.

    Je mets mon fichier avec les premières lignes pour donner une idée et le listing de mes cogitations.

    Merci d'avance pour tout éclairage.

    jps

    Le début de mon fichier :

    A1;Charles-Emile;né le 1892;né à Kerlouan;1916;prêtre;1919;professeur au collège de Lesneven;1941;recteur de Pencran;1944;chapelain de la Providence, Landerneau;1955;retiré à Keraudren;DCD le 1960
    A2;Francis;né le 1899;né à Concarneau;1927;prêtre et vicaire à Carhaix;1935;vicaire à Carantec;1938;sans poste;1941;disparaît de l'ordo;DCD le 1979
    A3;Jean-Marie;né le 1881;né à Plouénan;1909;prêtre et vicaire auxiliaire à Milizac;1911;vicaire à Sizun;1919;vicaire à Plouhinec;1932;retiré;DCD le 1932;étude : SR. 1932 p. 697-698
    A4;Fernand;né le 1907;né à Lambézellec;1933;prêtre et étudiant à Angers;1933;professeur au collège de Lesneven;DCD le 1962
    A5;François;né le 1883;né à Landivisiau;1908;prêtre et surveillant à l'école de Landivisiau;1924;vicaire à Cast;1925;vicaire à Plobannalec;1935;prêtre habitué à l'hospice de Pont-l'Abbé;DCD le 1937
    A6;Jean-François;né le 1881;né à Lampaul-Guimiliau;1905;prêtre et maître d'études au collège de Saint-Pol (1904);1907;vicaire à Guerlesquin;1931;recteur de Primelin;1938;recteur de Cléden-Cap-Sizun;DCD le 1952; Guerre 1914-1918;brancardier au Groupe de Brancardiers divisionnaire 169. Citation (Ordre de la 22 e Division);Brancardier-prêtre, adjoint à l'officier gestionnaire du G.B.D.;pendant la période de combats du 8 au 15 août et du 28 septembre au 12 octobre 1918, dans des zones violemment bombardées, a dirigé la recherche des tués;a retrouvé leurs corps malgré les difficultés du terrain, sans se soucier ni du danger ni de la fatigue;a assuré leur identification et a fait préparer les tombes et l'inhumation avec le soin le plus scrupuleux ". (Pondaven;étude : SR 1952 p. 214-215
    A7;Jean-Marie;né le 1846;né à Lampaul-Guimiliau;1870;prêtre et professeur au collège de Pont-Croix;1886;aumônier de l'hospice de Quimper;1893;chanoine honoraire1905;chanoine titulaire;1917;doyen du chapitre cathédral;1924;hôpital de Quimper;DCD le 1926;étude : SR. 1920 p;552;1926 p. 438-443. Pérennès H., M. Jean-Marie Abgrall;doyen du chapitre de la cathédrale de Quimper (1846-1926), Brest, Presse libérale, 1926, 40 p., 20 cm. Mr J.M. Abgrall ", Bulletin diocésain d'histoire et d'archéologie, 1926, p. 194-226. La Bretagne, dictionnaire du monde religieux dans la France contemporaine, Beauchesne, 1990, 418 p
    A8;Jean-Marie;né le 1874;né à Landivisiau;1899;prêtre;1900;vicaire à N-D. du Carmel, Brest;1904;professeur au collège de Bon Secours, Brest;1923;recteur de Logonna-Quimerc'h;1927;recteur de La Forest-Landerneau;DCD le 1929;étude : SR. 1929 p. 868-871
    A9;Jean-Marie;né le 1899;né à Plougourvest;1925;prêtre ,et vicaire à Brest-Recouvrance;1936;professeur à Pont-Croix;1946;recteur d'Esquibien;1948;recteur de Ploaré;1950;curé de Guipavas;1955;chanoine honoraire;1959;aumônier de Kervoanec, Plougourvest;1974;retiré à Keraudren;DCD le 1989; ;études au Kreisker;étude : QL 1989 p. 123-124
    A10;Laurent;né le 1882;né à La Roche-Maurice;1908;prêtre;1909;vicaire au Drennec;Guerre 14-18;1919;vicaire à Lanhouarneau;1920;chapelain à Lanroze;1931;chapelain à Gouézec;1932;recteur de Trézilidé;1948;recteur de Saint-Servais;1958;doyen honoraire et aumônier de l'hospice de Saint-Thégonnec;1959;retiré à Keraudren;DCD le 1969;études au Kreisker
    mon code :
    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
     
    #! /usr/bin/perl 
     
    # use strict;
    use warnings;
     
    use IO::File;
     
    my $fichier = "./Cures36.txt";
     
    # Lecture du fichier
    my $FICHIER = new IO::File $fichier, '<' or die("Impossible de lire le fichier : $fichier");
     
     
    # Affichage de quelques champs
     
    for ($i = 0; $i < 10; $i ++)
    {
    	my $ligne = $FICHIER->getline();
    	$ligne =~ /(DCD le 1\d{3})/; # création du motif
    	@affiche = split(/;/,$ligne);
    	print ($affiche[0] . ";". $affiche[1] . ";" . $affiche[2] . ";" . $affiche[3] . ";" . $1 . ";" . $affiche[4] . ";" . $affiche[5] . "\n");
     
    }
    close($FICHIER);

  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
    Essaie quelque chose de ce genre :

    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
     
    my $line = 'A1;Charles-Emile;né le 1892;né à Kerlouan;1916;prêtre;1919;professeur au collège de Lesneven;1941;recteur de Pencran;1944;chapelain de la Providence, Landerneau;1955;retiré à Keraudren;DCD le 1960';
     
    my @data = split (/;/, $line);
     
    my $num = $data[0];
    my $firstname = $data[1];
     
     
    # tableau contenant les évènements
    my %events;
     
    # valeurs à récupérer
    my ($birthday, $place, $death, $evt_date);
     
    for my $i (2..$#data){
     
    	# $1 = année de naissance
    	if ($data[$i] =~m /né le (\d+)/){
    		$birthday = $1;
    	}
    	# $1 = lieu de naissance
    	elsif ($data[$i] =~m /né à (.+)/){
    		$place = $1;		
    	}
    	# $1 = année du décès
    	elsif ($data[$i] =~m /DCD le (.+)/){
    		$death = $1;		
    	}
     
    	# $1 = année de l'évènement
    	elsif ($data[$i] =~m /^(\d{4})$/){ 
    		$evt_date = $1;
    	}
    	# $1 = évènement
    	elsif ($data[$i] =~m /(.+)/){
    		$events{$1} = $evt_date;
    	}
    }
     
    # valeurs mises dans l'ordre
    print "$firstname, $birthday, $place, $death, ";
     
    foreach my $evt (sort {$events{$a}<=>$events{$b}} keys %events){
    	print "$evt, $events{$evt}, ";
    }
    -- Jasmine --

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Nickel
    Bonsoir,

    Ta solution a très bien marché. Super.

    J'ai réussi à remettre de l'ordre dans mes données. Même si je n'ai pas encore compris tout à fait comment. Je vais décortiquer ton code pour le comprendre surtout les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    foreach my $evt (sort {$events{$a}<=>$events{$b}} keys %events){
    	print "$events{$evt};$evt;";
    Merci pour la solution.

    jps29

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $evt (sort {$events{$a}<=>$events{$b}} keys %events){
    	print "$evt, $events{$evt}, ";
    }
    Tu parcours les clés de ton hash (keys %events) avec une boucle foreach en ayant trié le tableau par ordre croissant des valeurs donc des dates afin de garder l'ordre chronologique sort {$events{$a}<=>$events{$b}.

    Est-ce plus clair?
    -- Jasmine --

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Les explications
    Merci pour l'explication. Elle permet de comprendre le mécanisme. Elle me montre aussi que j'ai une sacrée marge de progression devant moi.

    jps

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

Discussions similaires

  1. problème avec ordre des champs d’une requête
    Par Bonero dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/10/2012, 10h44
  2. ordre des champs dans une structure
    Par oussema dans le forum C
    Réponses: 8
    Dernier message: 08/03/2007, 18h42
  3. ordre des champs dans une table
    Par antartica dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 13/02/2007, 15h25
  4. [Débutant]Ordre des champs dans une table
    Par goony dans le forum Débuter
    Réponses: 4
    Dernier message: 16/02/2006, 12h05
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 06h53

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