Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  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 :
    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 :
    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é

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 323
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 323
    Points : 2 918
    Points
    2 918
    Billets dans le blog
    1

    Par défaut

    Pas besoin de la fonction substr en principe

    ou

    Code :
    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.
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    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 :
    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é

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 323
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 323
    Points : 2 918
    Points
    2 918
    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 :
    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 :
    print FILE_OUT "$ligne\n" if $ligne;
    Mes articles sur La programmation fonctionnelle en Perl publiés sur ce site:

    ________
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •