Longueur dynamique d'un fichier xls. en perl

Résolu
VivoBaggio Messages postés 140 Date d'inscription   Statut Membre Dernière intervention   -  
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
Bonjour,

J'ai un fichier excel et je dois le parcourir pour ensuite créer un csv. Pour le parcourir, j'utilise un pour ... fin pour. Mais les valeurs que j'y donne ne sont pas dynamique.
ex : foreach my $row (1 ... 166)
{
...
...
}
J'aimerais qu'il parcoure le fichier jusqu'à qu'il rencontre une ligne blanche. Dans mon cas, la ligne blanche est la 167 - 1 = 166.

Comment faire ? Merci
A voir également:

6 réponses

VivoBaggio Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
 
Allez, svp de l'aide. Merci
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Allez, svp de l'aide. Merci

Encore toi?!!! ;-))

Je vais jeter un coup d'oeil :-)
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
tu peux faire comme ça

#!/usr/bin/perl
use strict;use warnings;
use Spreadsheet::ParseExcel;

open F,">>resultat.csv"
   or die "E/S : $!\n";

#my $file = "keo4cUWzZ8_Test.xls";
my $file = "kflrssGMyz_Test.xls";
#my $file = "Test.xls";
my $excel = Spreadsheet::ParseExcel::Workbook->Parse($file);
my $sheet = ${$excel->{Worksheet}}[0];

foreach my $row (0 ... 65535){
  next unless  my $cell1 = $sheet->{Cells}[$row][0];
  my $cell2 = $sheet->{Cells}[$row][1];
  my $cell3 = $sheet->{Cells}[$row][2];
  my $cell4 = $sheet->{Cells}[$row][3];
  $cell4->{Val} =~s/[()]//g;
  $cell4->{Val} =~s/\D//g;
  $cell4->{Val} =~s/(?<=\d)(?=\d)/,/g;

#  my $cell5 = $sheet->{Cells}[$row][4];

#  my $res = "$cell1->{Val};$cell2->{Val};$cell3->{Val};$cell4->{Val};$cell5->{Val};";
  my $res = "$cell1->{Val};$cell2->{Val};$cell3->{Val};$cell4->{Val};";
  $res =~s/\n//;
  $res =~s/\x01\x53/oe/g;
  $res =~s/\x00//g;
  print "$res\n";
}
__END__

Donc si la cellule de la colone 1 est vide le rang est sauté
Ca te conviens comme ça?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
ou
#!/usr/bin/perl
use strict;use warnings;
use Spreadsheet::ParseExcel;
my $nbligne;
open F,">>resultat.csv"
   or die "E/S : $!\n";

my $file = "kflrssGMyz_Test.xls";
my $excel = Spreadsheet::ParseExcel::Workbook->Parse($file);
my $sheet = ${$excel->{Worksheet}}[0];

foreach my $row (0 ... eof){
  $nbligne++ if my $cell1 = $sheet->{Cells}[$row][0];
}

foreach my $row (0 ... $nbligne){
  my $cell1 = $sheet->{Cells}[$row][0];
  my $cell2 = $sheet->{Cells}[$row][1];
  my $cell3 = $sheet->{Cells}[$row][2];
  my $cell4 = $sheet->{Cells}[$row][3];
  $cell4->{Val} =~s/[()]//g;
  $cell4->{Val} =~s/\D//g;
  $cell4->{Val} =~s/(?<=\d)(?=\d)/,/g;

#  my $cell5 = $sheet->{Cells}[$row][4];

#  my $res = "$cell1->{Val};$cell2->{Val};$cell3->{Val};$cell4->{Val};$cell5->{Val};";
  my $res = "$cell1->{Val};$cell2->{Val};$cell3->{Val};$cell4->{Val};";
  $res =~s/\n//;
  $res =~s/\x01\x53/oe/g;
  $res =~s/\x00//g;
  print "$res\n";
}
__END__
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
VivoBaggio Messages postés 140 Date d'inscription   Statut Membre Dernière intervention  
 
Ouais encore moi, lol.
J'ai pris ta solution 2 qui marche presque. A la place de eof dans ta boucle, j'ai rentré 65535, sinon il ne m'écrivait que les 2 premières lignes dans le csv.
Bon ben encore merci de ton aide. La prochaine fois, je te joins directement. Lol.
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
je te joins directement. Lol

tu peux toujours demander ici, ainsi la communauté peut profiter de la solution ;-))
0