Fichier excel en .txt....

Fichier excel en .txt.... - Perl - Programmation

Marsh Posté le 22-07-2004 à 09:56:14    

bonjour,
J'ai un fichier en excel que j'ouvre, le script marche convenablement grace au module :http://cpan.uwinnipeg.ca/dist/Spreadsheet-ParseExcel
mais maintenant ce que j'aimerai c'est copier l'ensemble des informations du fichier excel dans un fichier .txt.Est ce que c'est possible?si c'est le cas comment puis je le faire.
Voici mon code qui me permet d'ouvrir un fichier excel:

Code :
  1. #!c:/perl/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use Spreadsheet::ParseExcel;
  5. my $oBook =
  6.     Spreadsheet::ParseExcel::Workbook->Parse('c:\DoublePlay\Monfichier.xls');
  7. my($iR, $iC, $oWkS, $oWkC);
  8. foreach my $oWkS (@{$oBook->{Worksheet}}) {
  9.     print "--------- SHEET:", $oWkS->{Name}, "\n";
  10.     for(my $iR = $oWkS->{MinRow} ; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
  11.         for(my $iC = $oWkS->{MinCol} ; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) {
  12.             $oWkC = $oWkS->{Cells}[$iR][$iC];
  13.             print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
  14.         }
  15.     }
  16. }


Message édité par ladym le 22-07-2004 à 09:58:03
Reply

Marsh Posté le 22-07-2004 à 09:56:14   

Reply

Marsh Posté le 22-07-2004 à 11:00:50    

en faite c'est bon je viens de trouver
pour qui sont interessés vioci le code

Code :
  1. #!c:/perl/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use Spreadsheet::ParseExcel;
  5. my @lignes=0;
  6. my $path = "c:\\progra~1\\VideoLAN\\VLC\\tt.txt";
  7. die "fichier non trouve !\n" if (! -s $path);
  8. open(FIC, ">>$path" ) or die "Can't open file: $!";
  9. @lignes = <FIC>;
  10. my $oBook =
  11.    
  12. Spreadsheet::ParseExcel::Workbook->Parse('c:\DoublePlay\DOCCANAL\PlanServiceBouquet9.xls')
  13. ;
  14. my($iR, $iC, $oWkS, $oWkC);
  15. foreach my $oWkS (@{$oBook->{Worksheet}}) {
  16.     print "--------- SHEET:", $oWkS->{Name}, "\n";
  17.     for(my $iR = $oWkS->{MinRow} ; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ;
  18. $iR++) {
  19.         for(my $iC = $oWkS->{MinCol} ; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ;
  20. $iC++) {
  21.             $oWkC = $oWkS->{Cells}[$iR][$iC];
  22.             print FIC "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
  23.         }
  24.     }
  25. }
  26. print $lignes[12];
  27. Close FIC;


 
 
mais j'ai un petit soucis quand je veux afficher une ligne de mon fichier .txt, j'ai l'erreur : suivante use of uninitialized value in print at line 37 cad celle la
"print $lignes[12];"

Reply

Marsh Posté le 22-07-2004 à 11:34:57    

j'essaye de mettre une boucle juste avant le "close FIC;"
comme ceci :

Code :
  1. for(my $j=0;$j< @lignes; $j++){
  2. print "je suis la2\n";
  3. print $lignes[$j];#affiche les éléments du tableau
  4. print $lignes[12];
  5. }


 
mais ça ne m'affiche rien est ce normal?j'ai essayé de le mettre entre chaque parenthèse mais ça ne marche pas non plus? que faire?

Reply

Marsh Posté le 22-07-2004 à 11:45:27    

my @lignes=0;  
 
ca passe ca?
fait un my @lignes tout court, ou bien my ligne = () (ca vient juste d'etre optimisé dans perl 5.8.5, donc mieux faut faire un simple my @lignes qui s'initialise tout seul plutot que l'initialiser deux fois si tu a une version de perl inferieure à 5.8.5 (ce qui est tres probable))
 
bon, sinon c'est le use warnings qui se plain ici:  
visiblement il y a moins de 13 lignes dans ton fichier, donc l'element 12 de ton tableau n'a pas été defini. si tu veux la 12emme ligne c'est $lignes[11] qu'il faut faire.
 
à part ca, pour ta boucle, en Perl pour iterer un tableau la meilleur solution est le foreach (en fait on le fait avec un for):
 
for (@lignes) {
  print $_, "\n";
}
 
et si tu veux connaitre la taille de ton tableau tu l'evalu dans un contexte scalaire (comme tu a fais dans ta boucle for):
 
print scalar(@lignes);
ou
print @lignes+0;
 
(si tu fait 'print @lignes' tout court il est evalué en contexte de liste car print s'attend à recevoir une liste)
 
ca te donne le nombre totale d'element du tableau, et donc le dernier element de ce tableau sera sa taille-1 (puisqu'il commence à 0)
 
tu peux aussi recuperer le rang du dernier element (donc taille-1) comme ca:
print $#lignes;
 
la, plus de porbleme de contexte scalair ou liste

Reply

Marsh Posté le 22-07-2004 à 12:02:11    

non ça ne marche pas que je mette my @lignes=0; ou my @lignes;  
j'ai toujours la même erreur. mais ce que je ne comprends pas c'est que mon tableau est assez grand car j'ai bcp d'element dedans donc que je mette 12 ou 11 ça devrait quand même m'afficher quelque chose?
- pour le parcours de mon tableau même en utilisant le foreach je n'ai rien qui s'affiche.
- en faite je travaille sous perl 5.6

Reply

Marsh Posté le 22-07-2004 à 12:12:57    

bon ok:
 
  open(FIC, ">>$path" ) or die "Can't open file: $!";  
  @lignes = <FIC>;  
 
la tu ouvre ton fichier en ecriture (et en ajout) !
 
donc tu ne peut pas lire dedans en meme temps!
 
si tu veux à la fois lire et ecrire il faut faire des trucs genre open(FIC, '+>>', $file), mais bon je te conseil d'eviter ca pour l'instant
 
regarde la doc (perlopentut)
 
en fait je comprend pas trop ce que tu veux faire?
 
tu veux verifier que ton fichier txt est bien ecrit? dans ce cas il faut le refermer et le réouvire en lecture, puis faire ton @lignes = <IN>
 
donc d'abord tu lourvre en ecriture (et en ajout si tu veux)
 
open(OUT, '>', $file)
 
et ensuite à la fin tu le close et le réouvre en lecture :
 
open(IN, '<', $file)

Reply

Marsh Posté le 22-07-2004 à 12:30:18    

oui c'est ça merci ça marche
mais qd je lui demande de m'afficher une des lignes de mon fichier, elle me l'affiche en plusieurs fois? est ce normal?
je mets ce code juste avant le "close FIC;"

Code :
  1. open(FIC, '<', $path) or die "Can't open file: $!"; # pour revenir au début du fichier
  2. while( <FIC> ) {
  3.   push @lignes, $_;
  4.   print $lignes[3];
  5. }
  6. close FIC;


 
concrétement j'aimerais que ça m'affiche toutes les 5èmes lignes de mon fichiers?comment faire?

Reply

Marsh Posté le 22-07-2004 à 12:42:16    

je fais une boucle pour qu'il m'affiche toutes les 5èmes lignes de mon fichier mais j'ai une boucle infinie

Code :
  1. for (my $j=11; $j< @lignes; $j+5){
  2. print $lignes[$j];#affiche les éléments du tableau
  3. }

Reply

Marsh Posté le 22-07-2004 à 12:44:32    

toutes les lignes multiples de 5?
 
tu peux faire ca:

Code :
  1. while( <FIC> ) { 
  2.       push @lignes;
  3.       print unless $.%5; 
  4.   }


 
par defaut push et print vont bosser sur $_
$. est le compteur de ligne, une variable speciale de perl.
la on regarde si le modulo 5 est nul, et si c'est le cas on affiche

Reply

Marsh Posté le 22-07-2004 à 15:03:58    

j'ai testé ça na marche pas, en faite je voualis savoir savez vous comment je peux faire pour selectionner les informations qui sont dans la colonne dont le nom est @multicast?faut il que j'utilise des motif?

Reply

Marsh Posté le 22-07-2004 à 15:03:58   

Reply

Marsh Posté le 22-07-2004 à 15:18:26    

tu parlais de 5eme ligne
la tu veux la 5eme colonne (!)
 
oui il va falloir que tu fasse une regexp, ou peut etre un simple split, suivant à koi ressemble tes lignes
 
tu a l'air de t'etre lancé dans tout ca sans vraiment avoir appris le Perl (d'apres tes autres posts egalement). Je te conseil de te procurer des tutoriel et boukins

Reply

Marsh Posté le 22-07-2004 à 16:36:52    

c'est ce que j'ai fait!!mais j'y connais rien

Reply

Sujets relatifs:

Leave a Replay

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