[PERL]Compter ligne remplie fichier excel

Fermé
Saoua83 - 5 juin 2009 à 12:08
 Saoua83 - 5 juin 2009 à 15:25
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;
}

4 réponses

lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566
5 juin 2009 à 13:20
Salut,

Tu as besoin de vérifier la ligne entière ou seulement la 1ère cellule de la ligne?!
0
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
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 566
5 juin 2009 à 14:48
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
ç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