Longueur dynamique d'un fichier xls. en perl

Résolu
VivoBaggio Messages postés 141 Statut Membre -  
lami20j Messages postés 21506 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
Configuration: Windows XP
Firefox 2.0.0.7

6 réponses

  1. VivoBaggio Messages postés 141 Statut Membre
     
    Allez, svp de l'aide. Merci
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Allez, svp de l'aide. Merci

    Encore toi?!!! ;-))

    Je vais jeter un coup d'oeil :-)
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. VivoBaggio Messages postés 141 Statut Membre
     
    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
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    je te joins directement. Lol

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