supprimer la premiere ligne d'un fichier

supprimer la premiere ligne d'un fichier - Perl - Programmation

Marsh Posté le 02-05-2015 à 07:18:57    

salut a tous j'ai besoin une fois de plus de votre aide .
j'ai un code donc je ne comprend pas ce qui ce passe j'arrive a supprimer la premiere ligne de mon fichier le result_3.csv le confirme, et dans la suite le fichier result_3.csv doit etre prise en consideration pour la suite, mais mahlheureusement lors de la sorti la ligne apparait de nouveau.
 

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. open(my $tmp, '>','result_3.csv') or die $!;   #je cree mon fichier result_3.csv
  5. open(my $fh, '<', 'result_2.csv') or die $!;    #j'ouvre mon fichier ou la premiere ligne doit etre efface
  6. @ARGV = ("result_2.csv" );        # le fichier est argumente
  7. #je supprime la premiere ligne
  8. while(<> ){
  9.     print $tmp "$_"  if 2 .. eof();  # j'ecris le resultat sur mon fichier result_3.csv
  10. }
  11. my $i = 0;
  12. my $n = 0;       #compteur pour les noms des fichiers produits
  13. my $fh_out;
  14. open($fh_out, '>', "output-$n.csv" ) or die $!;
  15. while (my $line = <$fh> ) {    # c'est a ce niveau qu'il ya probleme car j'aimerai pour la suite de mon code le fichier result_3.csv soit pris en concideration meme en ecrivant $tmp cela ne   m'apporte rien
  16.     print $fh_out $line;
  17.     if ($. % 10 == 0) {
  18.         close $fh_out;
  19.         # on ouvre un nouveau fichier
  20.         $n++;
  21.   $i++;
  22.         open($fh_out, '>', "output-$n.csv" ) or die $!;
  23.  print $fh_out "page $i\n";
  24.     }
  25. }


Message édité par Henri772 le 02-05-2015 à 07:34:15
Reply

Marsh Posté le 02-05-2015 à 07:18:57   

Reply

Marsh Posté le 02-05-2015 à 07:28:31    

?


Message édité par Henri772 le 02-05-2015 à 07:29:30
Reply

Marsh Posté le 02-05-2015 à 07:39:04    

c'est resolut j'ai vu mon erreur, merci bien mais pourquoi ca ne me mensionne pas le numero sur la premiere page

Reply

Marsh Posté le 02-05-2015 à 20:11:41    

Heu, si j'ai bien compris, c'est un truc comme ceci que vous voulez faire:
 

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my ($n, $i) = (0, 0);
  7. open(my $fh_out, '>', "output-$n.csv" );
  8. open(my $fh_in,  '<', 'result_2.csv');
  9. while (<$fh_in> ) {
  10.  if ($i) {
  11.    unless ($i % 10) {
  12.      close $fh_out;
  13.      open($fh_out, '>', "output-".++$n.".csv" );
  14.      print $fh_out "page $n \n";
  15.    }
  16.    print $fh_out $_;
  17.  }
  18.  ++$i;
  19. }
  20. close($fh_out);
  21. close($fh_in);


 
A moins que ce ne soit ceci, au vu de votre dernière phrase:

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my ($n, $i) = (0, 0);
  7. my ($fh_in, $fh_out);
  8. open($fh_in,  '<', 'result_2.csv');
  9. while (<$fh_in> ) {
  10.  unless ($i % 10) {
  11.    close($fh_out) if ($n);
  12.    open($fh_out, '>', "output-$n.csv" );
  13.    print $fh_out "page $n \n";
  14.    ++$n;
  15.  }
  16.  print($fh_out $_) if ($i);
  17.  ++$i;
  18. }
  19. close($fh_out);
  20. close($fh_in);


Quand on accède a plus d'un fichier à la fois, il vaut mieux éviter d'utiliser $., d’où mon emploi de $i.
 
A+,


Message édité par gilou le 02-05-2015 à 20:28:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-05-2015 à 16:19:17    

Salut Gilou c'est le deuxieme code qui est le bon , j'avais entre temps revu mon code et resolu le probleme mais je trouve le tient meilleur que le mien car dans le mien il yavais des repetions et c'etait pas agreable. comme je l'avais mensionner par ailleur j'apprend

Reply

Marsh Posté le 04-05-2015 à 17:49:06    

Henri772 a écrit :

Salut Gilou c'est le deuxieme code qui est le bon , j'avais entre temps revu mon code et resolu le probleme mais je trouve le tient meilleur que le mien car dans le mien il yavais des repetions et c'etait pas agreable. comme je l'avais mensionner par ailleur j'apprend


 
voila mon code:
 

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. open(my $tmp, '>','result_3.csv') or die $!;
  5. open(my $fh, '<', 'result_2.csv') or die $!;
  6. @ARGV = ("result_2.csv" );
  7. while(<> ){
  8.     print $tmp "$_"  if 2 .. eof();
  9. }
  10. my $i = 0;
  11. my $n = 0;   
  12. my $fh_out;
  13. open($fh_out, '>', "output-$n.csv" ) or die $!;
  14. print $fh_out "page $i\n";
  15. open($tmp, '<', "result_3.csv" ) or die $!;
  16. while (my $line = <$tmp> ) {
  17.     print $fh_out $line;
  18.     if ($. % 10 == 0) {
  19.         close $fh_out;
  20.         # on ouvre un nouveau fichier
  21.         $n++;
  22.   $i++;
  23.         open($fh_out, '>', "output-$n.csv" ) or die $!;
  24.  print $fh_out "page $i\n";
  25.     }
  26. }


Message édité par Henri772 le 04-05-2015 à 17:49:51
Reply

Marsh Posté le 04-05-2015 à 18:57:30    

j'ai aussi remarque un truc lorsque j'execute ton Code, normalement dans le decoupage le dernier fichier est celui qui devrai avoir moins de Nom de system , mais c'est le contraire que ton code fait , le premier fichier a moin de Nom de system

Reply

Marsh Posté le 05-05-2015 à 00:40:56    

> le dernier fichier est celui qui devrai avoir moins de Nom de system
ça veut dire quoi :??:  
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-05-2015 à 11:52:03    

si tu a 35 Mot a repartir en page , et que par page on aimerai avoir 10 Mots la premiere page jusqu'a la 3e page aurons 10 mot par page et la derniere n'en possederai que 5 mots c'est environs ce que je voulais dire par la

Reply

Marsh Posté le 05-05-2015 à 15:23:30    

Le premier a une ligne de moins parce que tu veux sauter la première ligne du fichier de départ, mais si tu veux qu'il ait 10 lignes de contenu, comme les autres, c'est très facile:

Code :
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my ($n, $i) = (0, 0);
  7. my ($fh_in, $fh_out);
  8. open($fh_in,  '<', 'result_2.csv');
  9. my $junk = <$fh_in>; # on saute la première ligne
  10. while (<$fh_in> ) {
  11.  unless ($i % 10) {
  12.    close($fh_out) if ($n);
  13.    open($fh_out, '>', "output-$n.csv" );
  14.    print($fh_out "page $n \n" ) if ($n); # virer le if ($n) si on veut le titre aussi pour le premier fichier
  15.    ++$n;
  16.  }
  17.  print($fh_out $_);
  18.  ++$i;
  19. }
  20. close($fh_out);
  21. close($fh_in);


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-05-2015 à 15:23:30   

Reply

Marsh Posté le 08-05-2015 à 12:18:32    

Salut Gilou  
j'avais une question car je ne comprend pas exactement ce que fait le Module autodie.  
 
Merci bien

Reply

Marsh Posté le 08-05-2015 à 12:48:12    

Le module autodie, c'est simple, il déclenche un die automatique lorsque l'on a un problème d'ouverture/fermeture/... de fichier.
Ça permet d'écrire
open($fh,  '<', 'fichier.txt');
plutôt que
open($fh,  '<', 'fichier.txt') or die "Erreur a l'ouverture de fichier.txt!\n;
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-05-2015 à 13:44:07    

Merci bien, c'est maintenant tres clair
 
Bonne Journee

Reply

Marsh Posté le 12-05-2015 à 09:38:35    

Salut Gilou,
j'ai une question concernant les chaines de Caracteres du genre  
 
{/(^|[\s.;])$item([\s.;]|$)/i}
 
si vous en connaissez des liens en Francais qui explique cela. j'en ai trouvé des liens en anglais mais en Francais, me conviendrai.
Merci bien et bonne journee

Reply

Marsh Posté le 12-05-2015 à 13:43:58    

Bonjour,
 
Vous pourriez jeter un œil aux liens de cette page ci: http://perl.mines-albi.fr/DocFr.html
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-05-2015 à 11:52:04    

Salut  
que pui je changer ou ajouter a cette ligne de maniere a ce qu'il fasse une difference entre 1 et 10 ainsi que entre 2 et 20 ainsi de suite  
 
my $regex = join '|', map {"\Q${_}\E"} @words; :??:  
 
car depuis pres de 2 jours je lis les Expressions Regulair mais je ne trouve pas comment le resoudre
 
 
Merci bien d'avance

Reply

Marsh Posté le 14-05-2015 à 13:44:27    

Si tu expliquais ce que tu veux faire, je pourrais aider. Parce que la, c'est loin d'être clair.
 
1) Tu as quoi en entrée? (ie dans @words)
2) et tu veux quoi en sortie dans $regexp?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-05-2015 à 15:27:18    

entree my @words = qw( disallow fault  /dev/lg_dumplv //ras 1);
mais il faut tenir compte que je peus aussi rechrcher autre chose.
 
sortie $regex    = qr{($regex)};  tout ce qu'il aura trouve

Reply

Sujets relatifs:

Leave a Replay

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