[PERL]Compter ligne remplie fichier excel

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...


#!/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;
}
A voir également:

4 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Tu as besoin de vérifier la ligne entière ou seulement la 1ère cellule de la ligne?!
0
Saoua83
 
Seulement la première case, car dans mon cas si celle-ci est vide alors automatiquement la ligne est vide. :)
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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;


0
Saoua83
 
ç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 !
0