Rechercher : dans
Par :

Pb Excel / Csv Perl

Dernière réponse le 3 oct 2007 à 18:21:20 VivoBaggio, le 1 oct 2007 à 17:44:16 
 Signaler ce message aux modérateurs

Bonjour. Voilà, j'ai un soucis avec mon script de Perl. Il a pour but de récupérer des données d'un fichier excel et de les retranscrire dans un fichier csv. Mon souci est au niveau de la récupération des données. Ils me les retranscrit bien, mais pas qu'une fois, il le fait plusieurs fois, il boucle les données une quinzaine de fois alors que je veux qu'il le fasse qu'une fois.
Pour moi, il y a un soucis au niveau des boucles, mais je n'arrive pas à le corriger et comme je débute en programmation, ça commence à me prendre la tête.
Je vous mets ci-dessous mon code. Merci de vouloir y jeter un oeil.

#!C:/Perl/bin/perl.exe
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
my $excel_in = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
my $book = $excel_in->Workbooks->Open("C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.xls");
my $sheet = $book->Worksheets(1);
my $array1 = $sheet->Range("A3:A167" )->{'Value'};
my $array2 = $sheet->Range("B3:B167" )->{'Value'};
my $sheet2 = $book->Worksheet(2);
$book->Close;
foreach my $ref_array1 (@$array1) {
foreach my $ref_array2 (@$array2) {
foreach my $scalar1 (@$ref_array1) {
foreach my $scalar2 (@$ref_array2) {
my $ligne=0;
foreach my $word1 ( split(' ',$scalar1) ) {
foreach my $word2 ( split(' ',$scalar2) ) {
print "$word1;$word2\n";
my $fichier= "C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.csv";
open F, ">>$fichier"; # ouverture en ajout dans un fichier existant
print F "$word1;$word2\n"; # écriture de $chaine dans le fichier
}
}
$ligne++;
}
}
}
}
close F;
print "File Completed\n";
system("pause");

Configuration: Windows XP
Firefox 2.0.0.7

Meilleures réponses pour « Pb Excel / Csv Perl » dans :
Excel - Convertir fichier(s) CSV / XLS Voir Comme dit dans le titre, cette application convertit des fichiers CSV en fichiers XLS N’est pas nécessaire pour Excel 2007, ce dernier faisant la conversion automatiquement La conversion n’ayant pas de mise en forme, en cas de modification...
Exporter à coup sûr du CSV VoirExporter des données au format CSV n'est pas si trivial qu'il n'y paraît. Dès que vos données contiennent des virgules ou des guillemets, tout semble partir en vrille. Il y a une astuce. Voici comment procéder pour exporter à coup sûr vos...
Import CSV: Mauvais alignement des dates VoirVous avez ouvert un fichier CSV avec Excel contenant une colonne de dates et ces dernières sont mal alignées. Elles sont par exemple tantôt alignées à droite, tantôt à gauche. A vrai dire, il se peut que votre problème soit plus grave que vous ne...
Fichier CSV VoirFormat CSV Un fichier CSV est un fichier tableur, contenant des données sur chaque ligne séparés par un caractère de séparation (généralement une virgule ou un point-virgule). Comment lire un fichier CSV ? Il peut être lu avec un tableur tel que...
Ouverture d'un fichier VoirOuverture d'un fichier existant crée avec le même logiciel Il existe fondamentalement deux méthodes pour ouvrir un fichier sous Windows : Choisissez dans le menu du logiciel concerné Fichier > Ouvrir et naviguez jusqu’au fichier concerné dans la...

1

lami20j, le 1 oct 2007 à 20:12:06

Salut,

essaie

#!C:/Perl/bin/perl.exe
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
my $excel_in = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
my $book = $excel_in->Workbooks->Open("C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.xls");
my $sheet = $book->Worksheets(1);
my $array1 = $sheet->Range("A3:A167" )->{'Value'};
my $array2 = $sheet->Range("B3:B167" )->{'Value'};
my $sheet2 = $book->Worksheet(2);
$book->Close;


my $fichier= "C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.csv";
open F, ">>$fichier"; # ouverture en ajout dans un fichier existant

my @x = split " ", join " ",map { split } @$array1;
my @y = split " ", join " ",map { split } @$array2;

print F "$x[$_];$y[$_]\n" for (0..$#x)
close F;
print "File Completed\n";
system("pause");
__END__
lami20j

Répondre à lami20j

2

VivoBaggio, le 2 oct 2007 à 10:20:46

J'aimerais savoir ce que tu as mis dans ton FOR car comme je débute en perl, je comprends pas ta syntaxe.
"print F "$x[$_];$y[$_]\n" for (0..$#x)"
Parcequ' avec ton code, le programme se lance, se termine, sans me créer mon csv.

Répondre à VivoBaggio

3

lami20j, le 2 oct 2007 à 10:37:06

Et mois j'ai besoin que tu m'envoies ton fichier excel pour tester.
Je n'aime pas travailler à l'aveugle.

mets ce code dans un fichier script.pl

#!C:/Perl/bin/perl.exe
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
my $excel_in = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
my $book = $excel_in->Workbooks->Open("C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.xls");
my $sheet = $book->Worksheets(1);
my $array1 = $sheet->Range("A3:A167" )->{'Value'};
my $array2 = $sheet->Range("B3:B167" )->{'Value'};
my $sheet2 = $book->Worksheet(2);
$book->Close;
for (@$array1){ print "-$_\n";}
for (@$array2){ print "=$_\n";}
__END__
execute ensuite le fichier avec la commande
perl script.pl >  c:\resultat.txt
et mets le fichier resultat.txt sur cjoint.com
lami20j

Répondre à lami20j

4

VivoBaggio, le 2 oct 2007 à 16:20:27

Je vais avoir du mal avec ton dernier code à te passer un fichier de sortie car il n'en crée pas, vu qu'il n'y a pas de code concernant la sortie. Donc j'insère le mien pour avoir une sortie, et là il ne me retranscrit rien. Mon csv est vide. Mais là n'est pas le soucis.

Sinon par rapport à ton code, tes 2 print me ressortent bien dans le fenetre dos les 165 info de chaque colonne.
Là où est le problème, c'est que je dois récupérer tes 2 print en un seul, 165 fois et non 165 x le nombre de colonnes. Et par rapport à mon code de départ, il me récupérait bien le print avec les 2 valeurs mais un nombre conséquent de fois.

Donc j'ai changé ton code pour essayer quelquechose
1er test
for (@$array1){ for (@$array2){ } }
print "$array1;$array2\n";

Il me récupère les 2 valeurs du print, mais qu'une fois (normal, je suis en dehors des 2 boucles)

2e test
for (@$array1){ for (@$array2){
print "$array1;$array2\n";
} }

Il me récupère les valeurs mais un nombre conséquent de fois (et là, ca m'emmerde. Retour à la case départ)

Comment faire pour récupérer les valeurs un nombre de fois égal aux nombre de lignes d'une colonne dans mon fichier excel (165 dans mon cas) ? Où le boucler ?

Répondre à VivoBaggio

5

lami20j, le 2 oct 2007 à 16:34:01

Je vais avoir du mal avec ton dernier code à te passer un fichier de sortie car il n'en crée pas, vu qu'il n'y a pas de code concernant la sortie.

Ce n'est pas le code qui créer le fichier mets la commande que tu dois taper en DOS
perl script.pl > c:\resultat.txt


Comme je vois que tu n'as pas compris alors execute celui là et passe moi le fichier.

#!C:/Perl/bin/perl.exe
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
my $excel_in = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
my $book = $excel_in->Workbooks->Open("C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.xls");
my $sheet = $book->Worksheets(1);
my $array1 = $sheet->Range("A3:A167" )->{'Value'};
my $array2 = $sheet->Range("B3:B167" )->{'Value'};
my $sheet2 = $book->Worksheet(2);
$book->Close;
open F,">>c:\resultat.txt"
  or die "E/S : $!\n";
for (@$array1){ print F "-$_\n";}
for (@$array2){ print F "=$_\n";}
__END__
J'attends ton retour

Mon code et fonctionnel. En revanche ça depends de ce que les cellules contiennent.
Si tu ne peux pas me dire, je ne pourrai pas t'aider. lami20j

Répondre à lami20j

6

VivoBaggio, le 2 oct 2007 à 17:20:46

http://cjoint.com/?kcrtrZOsQV pour le fichier .xls
http://cjoint.com/?kcruenriYZ pour le résultat.txt

Répondre à VivoBaggio

7

lami20j, le 2 oct 2007 à 22:39:33

#!C:/Perl/bin/perl.exe
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
my $excel_in = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
my $book = $excel_in->Workbooks->Open("C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.xls");
my $sheet = $book->Worksheets(1);
my $array1 = $sheet->Range("A3:A167" )->{'Value'};
my $array2 = $sheet->Range("B3:B167" )->{'Value'};
my $sheet2 = $book->Worksheet(2);
$book->Close;
open F,">>c:\resultat2.txt"
  or die "E/S : $!\n";
for (@$array1){ print F "-@$_\n";}
for (@$array2){ print F "=@$_\n";}
exécute et mets aussi le fichier resultat2txt sur cjoint.com lami20j

Répondre à lami20j

8

lami20j, le 2 oct 2007 à 23:18:34

#!C:/Perl/bin/perl.exe 
use strict;use warnings;
use Spreadsheet::ParseExcel;

open F,">>c:\resultat.csv"
    or die "E/S : $!\n";

my $file = "C:\\Clients\\Systeme_U\\marketing_distinctif\\produits_SU1107.xls";
my $excel = Spreadsheet::ParseExcel::Workbook->Parse($file);
my $sheet = ${$excel->{Worksheet}}[0];

foreach my $row (2 ... 166) {
  my $cell1 = $sheet->{Cells}[$row][0];
  my $cell2 = $sheet->{Cells}[$row][1];
  print F "$cell1->{Val};$cell2->{Val}\n";
}
__END__
--
lami20j

Répondre à lami20j

9

VivoBaggio, le 3 oct 2007 à 17:19:58

Tu as modifié mon code d'origine, mais tu as réussi à me le faire marcher. J'achète. Merci de ton aide.

Répondre à VivoBaggio

10

 lami20j, le 3 oct 2007 à 18:21:20

J'achète.

c'est gratuit ;-)

de rien :-) lami20j

Répondre à lami20j