[Perl] regrouper des lignes différentes en une seule ttes les n lignes

regrouper des lignes différentes en une seule ttes les n lignes [Perl] - Perl - Programmation

Marsh Posté le 30-03-2004 à 17:34:51    

Bonjour  :hello:  
 
Voilà, j'essaie de faire sous perl le truc suivant :
 
j'ai un fichier qui se présente comme ca :
 


 
 
 
 
 
ligne1
ligne2
ligne3
ligne4
ligne5
ligne6
ligne7
ligne8
ligne9
ligne10
ligne 11


 
et je voudrais le transformer en ca :
 

ligne1,ligne2,ligne3,ligne4,....,ligne9
ligne10,ligne11...,ligne 18
etc...


 
c'est à dire :
virer les premières lignes vides (y peut y en avoir d'autres dont j'ai besoin), et regrouper les lignes en champs, toutes les 9 lignes...
 
quelqu'un saurait comment faire ca ?

Reply

Marsh Posté le 30-03-2004 à 17:34:51   

Reply

Marsh Posté le 30-03-2004 à 18:33:29    

oui c'est pas trop dur à faire en Perl
 
un truc genre :

Code :
  1. use strict;
  2. open(IN, '<', shift) || die "usage: $0 fichier\n";
  3. my $i = 1;
  4. # on saute les lignes vides
  5. while(<IN> ) {
  6. unless (/^\s*$/) {
  7.  # on ecrit la premiere ligne...
  8.  s/\n/, /;
  9.  print;
  10.  # ... et on sort
  11.  last;
  12. }
  13. }
  14. # on ecrit les lignes suivante,
  15. # avec un saut de lignes toutes les 9 lignes
  16. while(<IN> ) {
  17. s/\n/, / if ++$i % 9;
  18. print;
  19. }
  20. close IN;


Message édité par pospos le 30-03-2004 à 18:38:32
Reply

Marsh Posté le 30-03-2004 à 20:44:20    

pospos a écrit :

oui c'est pas trop dur à faire en Perl
 
un truc genre :

Code :
  1. use strict;
  2. open(IN, '<', shift) || die "usage: $0 fichier\n";
  3. my $i = 1;
  4. # on saute les lignes vides
  5. while(<IN> ) {
  6. unless (/^\s*$/) {
  7.  # on ecrit la premiere ligne...
  8.  s/\n/, /;
  9.  print;
  10.  # ... et on sort
  11.  last;
  12. }
  13. }
  14. # on ecrit les lignes suivante,
  15. # avec un saut de lignes toutes les 9 lignes
  16. while(<IN> ) {
  17. s/\n/, / if ++$i % 9;
  18. print;
  19. }
  20. close IN;




 
merci beaucoup, j'étudie ca apres le java  :jap:  :hello:

Reply

Marsh Posté le 30-03-2004 à 22:23:44    

tiens sinon tu peux essayer ça ( mais c'est pas super si ton fichier est énorme)

Code :
  1. open(IN, 'tonfichier.txt');
  2. my @lines = <IN>;
  3. my $text = join '', @lines;
  4. $text =~ s/(( |)\n)+/,/gs;
  5. $text =~ s/^,//;
  6. $text =~ s/,$//;
  7. $text =~ s/((([^,]*),){8})/$1\n/gs;
  8. print $text."\n";
  9. close IN;

Reply

Marsh Posté le 01-04-2004 à 14:31:42    

Perchut2 a écrit :

Bonjour  :hello:  
 
c'est à dire :
virer les premières lignes vides (y peut y en avoir d'autres dont j'ai besoin), et regrouper les lignes en champs, toutes les 9 lignes...
 
quelqu'un saurait comment faire ca ?


 
Je propose ceci :
 

Code :
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my $datafile       = 'tst_hfr_1';     # fichier de donnees
  4. my $max_buff_lines = 9;               # nb lignes a concatener
  5. my $joint_str = ', ';                 # chaine de jointure pour concatener les lignes
  6. my @buffer;
  7. my $in_data;
  8. open FH, "<$datafile" or die "Unable to open $datafile : $!";
  9. while(<FH> ) {
  10.     # ignore une ligne vide (ou avec des blancs)
  11.     # si on a pas encore rencontré de donnée
  12.     next if not $in_data and m/^\s*$/;
  13.    
  14.     # une ligne non vide, on flag
  15.     $in_data = 1;
  16.     chomp;
  17.     push @buffer, $_;   
  18.     # on vide le buffer si il est plein
  19.     flush_buffer() if @buffer == $max_buff_lines;
  20. }
  21. # vide le buffer
  22. flush_buffer();
  23. sub flush_buffer {
  24.     print join($joint_str, @buffer);
  25.     print "\n";
  26.     @buffer = ();
  27. }
  28. close FH;
  29. __END__


 
--  
David "Sniper" Rigaudiere
Les mongueurs de Perl - http://www.mongueurs.net
Les Journées Perl 2004 - http://conferences.mongueurs.net/2004
 


Message édité par drigaudiere le 01-04-2004 à 14:40:32

---------------

Reply

Marsh Posté le 01-04-2004 à 15:02:56    

tiens un mongueur!
je vois parfois ton nom sur la liste ppm (je la survole, mais je n'y participe pas)

Reply

Marsh Posté le 01-04-2004 à 15:36:33    

pospos a écrit :

tiens un mongueur!
je vois parfois ton nom sur la liste ppm (je la survole, mais je n'y participe pas)


 
La non participation se pardonne, ne pas venir boire un coup avec
nous aux réunions mensuelles si t'es sur Paris c'est innadmissible :)
 
 
--  
David "Sniper" Rigaudiere
Les mongueurs de Perl - http://www.mongueurs.net
Les journées Perl 2004 - http://conferences.mongueurs.net/2004

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed