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 :

Expression régulières : ligne finissant par "\n" \r\n


Sujet :

Langage Perl

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut Expression régulières : ligne finissant par "\n" \r\n
    Salut,

    Je suis en train d'essayer de faire un script perl pour supprimer les lignes d'un fichier qui finissent par "\n"\r\n .

    Ca sera plus clair avec un exemple de la tronche du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ### UPDATENEW SISN "16"
    #TITRE_OUVRAGE#La Littérature maghrébine en langue française.\n
     La littérature maghrébine de langue française : 1 : origines et perspectives..
    #AUTEUR_PPP#ARNAUD, Jacqueline
    #EDITEUR_COMMERC#Publisud
    #EDITEUR_VILLE#Paris
    #EDITION_ANNEE#1986
    ...
    Quel logiciel me fait des exports aussi pourris? MINISIS, un truc de gestion de bibliothèque d'un autre temps... Bref.

    Faut donc que je détecte les lignes finissant par la chaine de caractère "\n" (j'insiste, la chaine, par le caractère de fin de ligne ), que je supprime ce "\n" et que je recolle la ligne à la ligne précédente...

    Je suis développeur PHP (Apache/ZF/Jquery & tout l'battaclant), je veux faire ça en PERL pour la rapidité d'éxecution (le fichier est conséquent), mais je n'y pipe rien.
    Le serveur est sous Windows, adios sed...

    Bref, une bonne âme pour m'aider à faire marcher / optimiser ce script???
    Pour l'instant j'arrive pas a detecté la chaine "\n" (d'ailleurs, le substr est il le moyen le plus rapide?)...
    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
     
    open(FILE_IN,$ARGV[0]);
    my @contenu = <FILE_IN>;
    close(FILE_IN);
     
    open(FILE_OUT,">$ARGV[0]");
    $ligneold = "";
    foreach my $ligne (@contenu)
    {
        chomp $ligne;
    	if(substr($ligne,0,-2) eq "\\n"){
    		$ligne =~ s/\\n//g;
                    $ligneold = $ligneold.$ligne;
    	} else {
    		$ligneold = $ligne;
    		print FILE_OUT "$ligneold\n";
    	}
    }
    close(FILE_OUT);
    Merci!
    Stay in Bed .. Save Energy

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Pas besoin de la fonction substr en principe

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat($ligne) if $ligne =~ s/\\n//g;
    devrait suffire.

    J'ai imaginé une fonction concat() parce qu'il me semble que ta concaténation est incorrecte. Tu veux sans doute la prochaine ligne, pas la dernière.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    Ah merci bien, j'ai pu modifier et au bout de quelques test, c'est bon, le script gagnant :
    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
     
    open(FILE_IN,$ARGV[0]);
    my @contenu = <FILE_IN>;
    close(FILE_IN);
     
    open(FILE_OUT,">$ARGV[0]");
    $lastligne = "";
    foreach my $ligne (@contenu)
    {
        chomp $ligne;
    	if ($ligne =~ s/\\n//g){
    		$lastligne = $lastligne.$ligne;
    	} else {
    		if (length($lastligne) > 0) {
    			print FILE_OUT "$lastligne\n"; 
    			$lastligne = "";
    		}
    		if (length ($ligne) > 0){
    			print FILE_OUT "$ligne\n";
    		}
    	}
    }
    close(FILE_OUT);
    C'est peu être optimisable. Enfin ca va déja vachement plus vite qu'un traitement en PHP.
    Merci!!
    Stay in Bed .. Save Energy

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Je ne comprends toujours pas bien pourquoi tu concatènes avec la ligne précédente et pas avec la ligne suivante, mais, enfin, si c'est ce dont tu as besoin...

    Pour info,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (length($lastligne) > 0) {
    peut sans doute se réécrire plus simplement:

    car une chaîne vide s'évalue à faux.

    De même pour la condition suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print FILE_OUT "$ligne\n" if $ligne;

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    Merci pour ces infos, je modifie.

    Je stocke parce qu'au moment ou je traite (dans la boule) je ne connais pas la ligne suivante (enfin, j'imagine qu'il doit y avoir un moyen, une seconde boucle sur le fichier par exemple).
    Donc je stocke la ligne en cours sans l'écrire.

    Une fois à la ligne "suivante", je refait le même traitement. Si la ligne est normale, alors j'écris le stockage avant d'écrire la ligne en cours.

    Au final ça revient au même, c'est juste que j'ai la flême de chercher comment accéder à la "ligne suivante" depuis la "ligne en cours" .

    Bref merci pour le coup de main, c'était mon 1er script en PERL !
    Stay in Bed .. Save Energy

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

Discussions similaires

  1. [RegEx] Simple ou double quote dans une expression régulière
    Par Khleo dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2010, 15h58
  2. Expression Régulière avec Quote
    Par jon301 dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2006, 22h08

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