[PERL]Compter ligne remplie fichier excel
Saoua83
-
Saoua83 -
Saoua83 -
Bonjour,
Voici mon problème, je dois convertir un fichier .XLS en fichier .TSV, et je ne peux pas prévoir combien de lignes de champs seront saisies dans le ficheir, comment faire pour tester si la première valeur de ma ligne courante est vide et ainsi stopper la conversion :/
Si quelqu'un à une idée, merci beaucoup.
Voici mon code pas propre pas optimiser je sais...
Voici mon problème, je dois convertir un fichier .XLS en fichier .TSV, et je ne peux pas prévoir combien de lignes de champs seront saisies dans le ficheir, comment faire pour tester si la première valeur de ma ligne courante est vide et ainsi stopper la conversion :/
Si quelqu'un à une idée, merci beaucoup.
Voici mon code pas propre pas optimiser je sais...
#!/usr/bin/perl
use strict;
use warnings;
use Spreadsheet::ParseExcel;
sub xls_csv_convert{
my ($file,$convert_file) = @_;
open (WRITER,"> $convert_file") or die ("E/S : $!\n");
my $excel = Spreadsheet::ParseExcel::Workbook->Parse($file);
my $sheet = ${$excel->{Worksheet}}[0];
foreach my $row (0 ... 384 ){
my $cell1 = $sheet->{Cells}[$row][0];
#if ($cell1->{Val} eq '') { break;}
my $cell2 = $sheet->{Cells}[$row][1];
if ($cell2->{Val} eq '') { $cell2->{Val} = 'NONE';}
my $cell3 = $sheet->{Cells}[$row][2];
if ($cell3->{Val} eq '') { $cell3->{Val} = 'NONE';}
my $cell4 = $sheet->{Cells}[$row][3];
if ($cell4->{Val} eq '') { $cell4->{Val} = 'NONE';}
my $cell5 = $sheet->{Cells}[$row][4];
if ($cell5->{Val} eq '') { $cell5->{Val} = 'NONE';}
my $cell6 = $sheet->{Cells}[$row][5];
if ($cell6->{Val} eq '') { $cell6->{Val} = 'NONE';}
my $cell7 = $sheet->{Cells}[$row][6];
if ($cell7->{Val} eq '') { $cell7->{Val} = 'NONE';}
my $cell8 = $sheet->{Cells}[$row][7];
if ($cell8->{Val} eq '') { $cell8->{Val} = 'NONE';}
my $cell9 = $sheet->{Cells}[$row][8];
if ($cell9->{Val} eq '') { $cell9->{Val} = 'NONE';}
my $cell10 = $sheet->{Cells}[$row][9];
if ($cell10->{Val} eq '') { $cell10->{Val} = 'NONE';}
my $cell11 = $sheet->{Cells}[$row][10];
if ($cell11->{Val} eq '') { $cell11->{Val} = 'NONE';}
my $cell12 = $sheet->{Cells}[$row][11];
if ($cell12->{Val} eq '') { $cell12->{Val} = 'NONE';}
my $cell13 = $sheet->{Cells}[$row][12];
if ($cell13->{Val} eq '') { $cell13->{Val} = 'NONE';}
my $cell14 = $sheet->{Cells}[$row][13];
if ($cell14->{Val} eq '') { $cell14->{Val} = 'NONE';}
my $cell15 = $sheet->{Cells}[$row][14];
if ($cell15->{Val} eq '') { $cell15->{Val} = 'NONE';}
my $cell16 = $sheet->{Cells}[$row][15];
if ($cell16->{Val} eq '') { $cell16->{Val} = 'NONE';}
my $res = "$cell1->{Val}\t$cell2->{Val}\t$cell3->{Val}\t$cell4->{Val}\t$cell5->{Val}\t$cell6->{Val}\t$cell7->{Val}\t$cell8->{Val}\t$cell9->{Val}\t$cell10->{Val}\t$cell11->{Val}\t$cell12->{Val}\t$cell13->{Val}\t$cell14->{Val}\t$cell15->{Val}\t$cell16->{Val}";
$res =~s/\n//;
$res =~s/\x01\x53/oe/g;
$res =~s/\x00//g;
print WRITER "$res\n";
}
close WRITER;
}Configuration: Linux Firefox 3.0.10
4 réponses
-
Salut,
Tu as besoin de vérifier la ligne entière ou seulement la 1ère cellule de la ligne?! -
Seulement la première case, car dans mon cas si celle-ci est vide alors automatiquement la ligne est vide. :)
-
Re,
En ce cas, tu peux faire avec une boucle while (je n'ai pas testé)my $row=1; while ($row != 65536){ ...... ...... last if $sheet->{Cells}[$row][0] eq ''; $res =~s/\n//; $res =~s/\x01\x53/oe/g; $res =~s/\x00//g; print WRITER "$res\n"; ++$row; } close WRITER;
-
ça fonctionne parfaitement ! merci je ne connaissais pas ce "last if" il m'a l'air bien utile ! MERCI
me reste plus qu'à optimiser le nombre de lignes de codes !