p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 28
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : avril 2006
    Messages : 1 349
    Points : 1 427
    Points
    1 427

    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
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 741
    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 : 1 741
    Points : 4 686
    Points
    4 686
    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.
    La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements

    _____
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

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

    Informations forums :
    Inscription : avril 2006
    Messages : 1 349
    Points : 1 427
    Points
    1 427

    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
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 741
    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 : 1 741
    Points : 4 686
    Points
    4 686
    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;
    La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements

    _____
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

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

    Informations forums :
    Inscription : avril 2006
    Messages : 1 349
    Points : 1 427
    Points
    1 427

    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. Réponses: 2
    Dernier message: 27/12/2010, 15h58
  2. Expression Régulière avec Quote
    Par jon301 dans le forum Syntaxe
    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