[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;
}
Configuration: Linux
Firefox 3.0.10

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

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