Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/12/2012, 18h28   #1
boo64
Membre Expert
 
Inscription : avril 2006
Messages : 1 348
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 348
Points : 1 379
Points : 1 379
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
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 19h16   #2
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 570
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 : 570
Points : 1 121
Points : 1 121
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.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 20h38   #3
boo64
Membre Expert
 
Inscription : avril 2006
Messages : 1 348
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 348
Points : 1 379
Points : 1 379
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
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2012, 23h02   #4
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 570
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 : 570
Points : 1 121
Points : 1 121
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;
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2012, 14h29   #5
boo64
Membre Expert
 
Inscription : avril 2006
Messages : 1 348
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 348
Points : 1 379
Points : 1 379
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
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h15.


 
 
 
 
Partenaires

Hébergement Web