PERL : recuperer les 250 premiers caracteres d'un fichier...

PERL : recuperer les 250 premiers caracteres d'un fichier... - Perl - Programmation

Marsh Posté le 07-05-2003 à 10:48:53    

bonjour,  
 
je dispose d'un fichier texte dont la taille peut etre tres importante (plusieurs mo).  
Je souhaite recuperer dans une variable les 250 premiers caracteres et stocker le reste du fichier  
dans un nouveau fichier. Je ne vois pas comment gerer cela en Perl, avez-vous une idée ?

Reply

Marsh Posté le 07-05-2003 à 10:48:53   

Reply

Marsh Posté le 07-05-2003 à 11:03:32    

A tester :

Code :
  1. use strict;
  2. my $FichierBase = "oukilégroleufichier.txt";
  3. my $NbCarMAX = 250;
  4. my $Chaine = "";
  5. my $FichierNew = "toto.txt";
  6. open(BASE, "$FichierBase" ) or die("err $FichierBase : $!\n" );
  7. open(NEW, ">$FichierNew" ) or die("err $FichierNew : $!\n" );
  8. while(<BASE> ) {
  9.     if (length($Chaine < $NbCarMAX)) {
  10.         $Chaine .= $_;
  11.         while(length($Chaine > $NbCarMAX)) {
  12.             push(@_, chop($Chaine));
  13.         }
  14.         if (@_) {
  15.             @_ = reverse(@_);
  16.             foreach my $Car(@_) {
  17.                 print NEW $Car;
  18.             }
  19.         }
  20.     } else {
  21.         print NEW $_;
  22.     }
  23. }
  24. close BASE;
  25. close NEW;


 
L'ai pas testé mais bon ...
 
Je reconnais que le code est du genre tordu mais j'suis d'humeur joyeuse aujourd'hui  :D
 
Edit1 : hum, et si j'utilisais la variable que j'me suis fait suer à déclarer($NbCarMAX) mais que j'utilisais po ?  :whistle:
Edit2 : variable $i supprimée, je m'en servais po  :( Eh bezot3, t'es toujours là ? T'as confiance en moué ? [:yaisse2]


Message édité par Aricoh le 07-05-2003 à 11:20:49

---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 07-05-2003 à 11:06:52    

juste une question : tu te serts pas de ta variable max_nb_car qui est a 250 mais plutot de 125 !! Juste un oubli je pense ...

Reply

Marsh Posté le 07-05-2003 à 11:09:12    

bezot3 a écrit :

juste une question : tu te serts pas de ta variable max_nb_car qui est a 250 mais plutot de 125 !! Juste un oubli je pense ...

merci, suis vraiment trop tordu today  :sweat:  
 
As-tu capté ce que fais mon code ?


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 07-05-2003 à 11:20:55    

oui a peu pres mais je pensais a un truc plus simple :
 
je copie le fichier source en fichier cible, ensuite je supprime les 250 premiers caracteres dans le fichier cible. Mais la question est comment supprimer ces 250 premiers caracteres. sinon, je vais m'orienter vers ta solution meme si elle me fait peur pour de gros fichiers.

Reply

Marsh Posté le 07-05-2003 à 13:08:37    

ben avec un substr tiens!

Code :
  1. open (R, "tongrosfichier" );
  2. while (<R> )
  3. {
  4. chomp;
  5. $lignes .=$_;
  6. }
  7. $jegardesles250premierscaracteres = substr($lignes, 0, 250);
  8. $jegardeslafindugrosfichier = substr($lignes, 250, length($lignes));
  9. open (W, "restedugrofichier" );
  10. print W $jegardeslafindugrosfichier;
  11. [code]
  12. sinon, à la place de substr tu peux faire :
  13. [code]
  14. $i =length($ligne);
  15. $j = $i;
  16. while ($i > $j -250)
  17. {
  18. unshift (@tab, chop($lignes));
  19. }
  20. print W join ("", @tab);


 
et voilà
 
--edit--  
la première est plus performante


Message édité par arghbis le 07-05-2003 à 13:09:19
Reply

Marsh Posté le 07-05-2003 à 13:21:34    

2 remarques pour ton code, arghbis :
 
1 - tu utilises chomp(), ce qui vire le retour chariot ("\n" ) mais lorsque tu print les lignes dans le second fichier, y a pas de "\n", le fichier risque de contenir au final 1 seule ligne.
 
2 - tu charges l'ensemble du fichier en mémoire, ce qui risque de pas être génial car le fichier peut être très volumineux


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 07-05-2003 à 13:38:49    

et??
 
est-ce un problème d'avoir tout sur une seule ligne? il n'a pas précisé
 
pour le deuxième, effectivement, je charges tout en mémoire. il y a moyen de ne pas le faire.
je proposais pas une soluce de remplacement à la tienne, juste pour indiquer qu'on peut faire la chose de manière différente après faut faire des choix.
 
bon par contre, je vois pas pq il veut pas utiliser ton code!!

Reply

Marsh Posté le 07-05-2003 à 13:42:00    

arghbis a écrit :

et??
est-ce un problème d'avoir tout sur une seule ligne? il n'a pas précisé


Oui mais au cas où il souhaite récupérer un second fichier n'étant qu'une copie tronquée du premier, mieux vaut éviter le chomp() dans ce cas.
 

arghbis a écrit :

je proposais pas une soluce de remplacement à la tienne, juste pour indiquer qu'on peut faire la chose de manière différente après faut faire des choix.

TIMTOWTDI !  :D
 

arghbis a écrit :

bon par contre, je vois pas pq il veut pas utiliser ton code!!


Il doit avoir peur que ça casse tout sur sa bécane  :lol:  
Ceci dit, j'ai tapé mais pas testé, si ça se trouve ça compile même pas, mon truc  :)


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 07-05-2003 à 15:48:32    

ben ça c évident que ça compile pas ton code, t'as deux ou trois erreurs de syntaxes, mais c pas le pb!
si je te donne un bout de code, je pense que t'es assez qualifié pour voir si y'a des erreurs et les corriger non??
 
sinon, faut pas utiliser un code quand on sait pas ce qu'il fait, c le meilleur moyen de tout planter!
 
Ps : c koi ton TIMTOW.... ???

Reply

Marsh Posté le 07-05-2003 à 15:48:32   

Reply

Marsh Posté le 07-05-2003 à 15:52:39    

arghbis a écrit :

ben ça c évident que ça compile pas ton code, t'as deux ou trois erreurs de syntaxes, mais c pas le pb!
si je te donne un bout de code, je pense que t'es assez qualifié pour voir si y'a des erreurs et les corriger non??
 
sinon, faut pas utiliser un code quand on sait pas ce qu'il fait, c le meilleur moyen de tout planter!
 
Ps : c koi ton TIMTOW.... ???

Soit pas agressif, c'est pas bon pour la santé :D  
 
TIMTOWTDI = There Is More Than One Way To Do It


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 07-05-2003 à 16:04:41    

bah chuis pas agressif, désolé du malentendu!!  :hello:  
 
ben maintenant, je serais moins con, j'ai appris  
TIMTOWTDI :whistle:

Reply

Marsh Posté le 08-05-2003 à 11:19:31    

arghbis a écrit :

bah chuis pas agressif, désolé du malentendu!!  :hello:  
 
ben maintenant, je serais moins con, j'ai appris  
TIMTOWTDI :whistle:  

Les anglais Perlistes prononcent "Tim Toady", c'est po moi qui le dis, c'est écrit dans le Camel Book ;)

Reply

Sujets relatifs:

Leave a Replay

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