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 syntaxe $/


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Problème syntaxe $/
    Bonjour à tous. Je débute dans Perl alors ayez pitié

    Le problème est le suivant.
    Je dispose d'une liste (très longue) sous forme de fichier .txt se présentant sous la forme.

    Name : ......
    Cost : .......
    Rules : ....(ici plusieurs lignes peuvent apparaitre avec des retours a la ligne)
    Set : .....

    puis deux retours à la ligne marquent la fin de chaque paragraphe.

    L'idée est de ramener chaque paragraphe à une seule ligne pour en faire un gros fichier csv. Mais mon problème est de conserver pour le champ "Rules" une information d'ou se trouvent les éventuels \n pour pouvoir par la suite remettre en page correctement mes données. Je pensais donc les remplacer par une balise quelconque de ma création.

    En parcourant X forums je suis arrivé à tenter de manipuler mes paragraphes en faisant un
    $/ = '\n\n';
    en début de programme histoire de prendre tout le bloc d'un coup et faire mes petites opérations ensuite. Ce changement me semblait prometteur et je me voyais déjà grandement simplifier le code déjà produit.

    Mais voila, je suis très vite arrivé à ma limite et depuis j'ai des soucis lorsque je fais une boucle. par exple.
    foreach (<>){
    s/\n/CLRF/;
    print $_;
    }
    Seul le premier \n trouvé est remplacé par mon CLRF, et tous les autres restent présents. Et là je sèche et ne comprends pas bien pourquoi les autres ne sont pas remplacés.
    Evidemment je n'avais pas ce type de problèmes avant de tenter le: $/ ='\n\n'; malheureusement mon "Learning Perl" ne fait pas mention de $/ si bien que j'ai du mal à percevoir les mystères de cette variable. Je crois même que si mon livre n'aborde pas le sujet c'est que ça ne s'adresse pas à ceux (comme moi) qui n'en sont qu'à l'étape "Learning" .

    Donc je serais reconnaissant si quelqu'un pouvait m'éclairer ou me donner qqs conseils. Merci d'avance ...

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Salut a toi,
    $/="X"; permet de changé le caractère dit de fin de ligne.
    Dans ton cas tu donne \n\n donc un paragraphe sera considéré comme une ligne.
    Pour les fichier csv le caractère séparateur est un point virgule il me semble donc le traitement devrait avoir cette gueule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    open(HANDLE1,"new4.txt");
    open(HANDLE2,">new5.csv");
    $/="\n\n"
    while(<HANDLE1>){
    	my $youpi=$_;
    	chomp youpi;
    	$youpi=~tr/\n/;/;
    	print HANDLE2 "$youpi\n";
    }
    Resultat
    Name : TOTO;Cost : 1000;Rules : rule1;rule2;rule3;Set : etmatch;
    Name : TITI;Cost : 1000;Rules : rule1;rule2;rule3;Set : huit;

    Vérifie et dis moi si j'ai merdé ^^

    Mais il y a beaucoup plus simple (avec le ";" comme séparateur), (le \n supplémentaire de fin de paragraphe ne sera pas chompé et va faire sauter une ligne):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    open(HANDLE1,"new4.txt");
    open(HANDLE2,">new5.csv");
    while(<HANDLE1>){
    	$youpi=$_;
    	chomp youpi;
    	print HANDLE2 "$youpi;";
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Merci à toi Sooners
    Salut, et merci encore.

    J'avais déjà qqchose de ressemblant à ta soluce mais je ne peux pas remplacer tous les \n du fichier vu que je voudrais garder tout ce qui est Rule sous forme de bloc.
    Jmexplik.
    Il peut y avoir une douzaine, comme aucune "Rule", et la solution de tout remplacer me met dans le cas ou je peux avoir:

    Name : toto; Cost:1000;rule1;rule2;rule3;Set :etmatch;
    Name : tata; Cost:trocher; rule1; Set:etmatch;

    Et du coup je n'ai plus le meme nombre de colonnes pour chaque ligne. (Je dis pas que c'est insoluble mais juste chiant ).

    Je teste ta soluce pour voir si ça résoud mon problème de boucle-qui-passe-qu'une-fois.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bon ben nickel ça marche. (la boucle). Merci encore.

    Par contre je comprends pas pourquoi dans mon foreach en exemple le traitement se faisait que sur le premier \n... mystère.

    Un dernier truc si tu passes encore par ce post :
    tu utilises tr/\n/;/;
    ou je ne faisais qu'un s/\n/;/

    Je pige pas trop la différence là mais ça a l'air décisif. Si tu as 2 minutes pour m'expliquer je te ferais une petite chappelle à la maison et j'honorerais ton nom et te ferais des offrandes et tout et tout .

  5. #5
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par iggukk Voir le message
    Par contre je comprends pas pourquoi dans mon foreach en exemple le traitement se faisait que sur le premier \n... mystère.
    Parce que tu ne lui as pas spécifié de le faire plusieurs fois (en ajoutant un modificateur de comportement /g à la fin de la regexp). Exemple pour une substitution globale :
    Un dernier truc si tu passes encore par ce post :
    tu utilises tr/\n/;/;
    ou je ne faisais qu'un s/\n/;/
    l'opérateur tr transforme par défaut toutes les occurrences d'une liste de caractère par une autre liste de caractère (voir perldoc perlop)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bon bah Philou a répondu avant moi tu peut monter une chapelle a son nom j'suis pas jaloux Par contre pour ce qui est des offrandes je prends

  7. #7
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Sinon, pour traiter ton problème initial et conserver la singularité de l'élément Rule qui peut être sur plusieurs lignes, tu peux avoir une approche différente en utilisant une table de hachage pour ranger les différentes lignes de chaque colonne d'un bloc de donnée:

    Exemple:

    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
    use strict;
    use warnings;
     
    my $infile = "new4.txt";
    my @columns = qw(Name Cost Rules Set);
     
    open my $HANDLE1,"<", $infile;
    open my $HANDLE2,">", "new4.csv";
     
    my %bloc = ();
    my $column;
    while (my $line = <$HANDLE1>) {
      chomp $line;
      # Identifie le début d'une nouvelle colonne
      if ($line =~ /(\w+)\s*:/) {
        $column = $1;
      }
      # Verifie si une colonne a été détectée et stocke l'information de la ligne
      # courante dans une liste elle même en valeur d'une table de hashage dont la clé
      # est le nom de la colonne
      die "Column prefix not found at line $. in $infile\n" if !defined $column;
      push @{$bloc{$column}}, $line;
     
      # Fin de bloc ?
      if ($line =~ /^\s*$/) {
        # Pour chaque colonne, joindre toutes les lignes de cette colonne avec \n
        # et assembler toutes ces colonnes en les séparant de ;
        print $HANDLE2 join ";", map { join "\n", @$_ } @bloc{@columns};
        %bloc = ();
        $column = undef;
      }
    }
    # Ne pas oublier de traiter le dernier bloc si une ligne vide ne fini pas le fichier
    print $HANDLE2 join ";", map { join "\n", @$_ } @bloc{@columns} if %bloc;
    J'ai commenté et testé grossièrement. Si tu as besoin de détails supplémentaires, n'hésite pas.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Un grand MERCI pour le temps consacré Messieur(dame?)s. Respect.

    Pour le /g en fin de regexp <= j'aurais pu mieux chercher, j'avais lu ce truc, honte à moi!

    Le tr/ c'est encore terra incognita pour moi, perldoc pigé.

    Sinon c'est un sacré conseil que tu me donnes là Philou, je m'attendais pas à tant. Ca m'ouvre carrément de nouvelles pistes, tu relances la machine, ça va bosser ces prochains jours, je le sens.

    Je vous ai fait un petit totem chacun sur mon étagère des divinités en face de mon bureau et je ne manquerais pas de vous réciter des chapitres de mon "Learning Perl" chaque soir.

    Encore Merci.

  9. #9
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par iggukk Voir le message
    Je vous ai fait un petit totem chacun sur mon étagère des divinités en face de mon bureau et je ne manquerais pas de vous réciter des chapitres de mon "Learning Perl" chaque soir.
    On ne peut que regretter la disparition des éditions française de O'Reilly, dont l'excellentissime Camel book.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

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

Discussions similaires

  1. ajout clé étrangère problème syntaxe
    Par philippe281281 dans le forum Outils
    Réponses: 7
    Dernier message: 11/04/2006, 14h20
  2. Réponses: 1
    Dernier message: 05/04/2006, 14h22
  3. [Tableaux] problème syntaxe concaténation variable
    Par mussara dans le forum Langage
    Réponses: 3
    Dernier message: 01/03/2006, 11h24
  4. Problème syntaxe sql
    Par devdev dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 11/04/2005, 16h31
  5. problème syntaxe sql
    Par mpat dans le forum ASP
    Réponses: 6
    Dernier message: 01/02/2005, 19h28

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