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 :

[langage] Trier les lignes d'un fichier et les réécrire dans un autre


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 104
    Points : 49
    Points
    49
    Par défaut [langage] Trier les lignes d'un fichier et les réécrire dans un autre
    Salut,

    je souhaite trier les lignes d'un fichier de la forme (ligne formée d'1 chaîne en début à ne pas modifier suivie de un ou plusieurs entiers, le tout séparé par des tabulations ) :

    AcrR 484843
    Ada 2308425 4411838 2145562
    AdiY 4338102
    AlpA 3651558
    AppY 1036963
    AraC 70048 70387 2980204 1984151 411705
    ArcA 4213057 1036963 582904 328558 770678 450834 3681077 4028561 953689 1686401 1684612 3126036 2350667 753691 1194346 3775026 3381903 2403092 754400 4098391

    J'utilise une fonction de tri et je recopie le résultat dans un autre fichier mais j'obtiens :
    AcrR 484843
    Ada 2145562
    2308425 4411838
    AdiY 4338102
    AlpA 3651558
    AppY 1036963
    AraC 70048 70387 411705
    1984151 2980204
    ArcA 328558 450834 582904 753691 754400 770678 953689 1036963 1194346 1684612 1686401 2350667 2403092 3126036 3381903 3681077 3775026 4028561 4098391

    Des sauts de ligne apparaissent au beau milieu de mes lignes suivi d'une tabulation; de plus, les lignes ne comportant que 2 éléments à trier se retrouvent suivies d'une ligne vide !!!

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    sub trierFTPosK12Txt
     
      {
      	my ($fichierIn) = @_;
     
      	if (!-e $fichierIn) {
       	die "fichier $fichierIn introuvable !";
       	}
     
       	open(FICRES,">FTTargPosTrie.txt") or die "Ouverture impossible du fichier $fichierOut en ecriture";
     
    	# Ouverture du fichier
    	open(DONNEE,"<$fichierIn") or die "Ouverture impossible du fichier $fichierIn en lecture";
     
     	while(<DONNEE>) {
    		# Récupération de la ligne courante
     		my @tab = split "\t";
     
    		if (scalar @tab <= 2) { # Pour les lignes ne contenant qu'un seul entier, on ne fait pas de tri
    			$, = "\t";
    			print FICRES @tab;
    			#print FICRES "\n"; apparemment il vaut mieux ne pas le mettre sinon une ligne vide après
    		}
     
    		else {
    			print FICRES $tab[0];
    			print FICRES "\t";
    			# On enlève la chaine située au premier indice de la liste
    			shift(@tab) ;
    			# Tri du tableau selon l'ordre croissant
    			@tab = sort tri_num @tab;
    			$, = "\t";
    			print FICRES @tab;
    			print FICRES "\n";
    		}
     
    	}
     
    	close DONNEE;
    	close FICRES;
     
      }
     
     
    # Fonction de tri d'un tableau d'entiers pour la fonction trierFTPosK12Txt
    sub tri_num ($$){
    	my ($gauche,$droit) = @_;
    	return $gauche <=> $droit;
    }
    Si quelqu'un pouvait me défaire de cette m...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 62
    Points : 59
    Points
    59
    Par défaut
    Salut,

    les lignes que tu "splites" sont de la forme: chaine\tnb1\tnb2\tnb3\n par exemple. A mon avis quand tu fais ton split, tu auras dans ton tableau:
    chaine
    nb1
    nb2
    nb3\n !
    Donc, quand tu auras trié, tu auras une ligne de la forme

    chaine\tnb2\tnb3\n\tnb1\n

    ce qui t'affichera dans ton fichier:
    chaine nb2 nb3
    nb1
    ...

    Avant de faire ton split, utilise la fonction chomp qui enlève le "\n" à la fin de la ligne, si il existe.
    Dis moi si ca marche

    Matthieu

  3. #3
    Membre du Club
    Inscrit en
    Juin 2002
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    merci une fois deplus, c'était bien ça !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 62
    Points : 59
    Points
    59
    Par défaut
    de rien

    Matthieu

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

Discussions similaires

  1. Trier les lignes d'un fichier texte
    Par supcomingenieur dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 23/04/2013, 00h38
  2. Réponses: 21
    Dernier message: 17/12/2012, 15h38
  3. Réponses: 2
    Dernier message: 19/01/2011, 15h41
  4. Réponses: 2
    Dernier message: 19/09/2006, 21h34

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