Transformation .csv/.xls en perl

Résolu/Fermé
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009 - 18 janv. 2008 à 10:15
 zotla - 26 juin 2008 à 23:55
Bonjour,

Il y a quelques temps, j'avais demandé de l'aide sur la conversion d'un fichier .xls en .csv en perl. Et j'avais réussi à faire ma conversion grâce à vous. Maintenant, je dois faire l'inverse, c'est à dire passer un fichier .csv en .xls, toujours en perl.
J'aurais aimé savoir s'il y avait besoin d'une librairie dans ce cas-ci, comme j'avais eu besoin de la librairie "Spreadsheet::ParseExcel;" pour le cas précédent.
Merci d'avance de votre aide.
A voir également:

6 réponses

VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
18 janv. 2008 à 12:12
Rebonjour,

Donc par rapport à la question que j'ai posé, j'ai vu que je devais utiliser le module "Spreadsheet::WriteExcel;".
Par rapport à mon projet, pour le moment, j'arrive à récupérer mes données du fichier csv et à créer mon fichier excel. Là où je bloque, c'est pour insérer mes données dans le fichier excel.
Merci d'avance pour votre aide.

Je vous mets mon code actuel ci-dessous :

use strict;
use warnings;
use Spreadsheet::WriteExcel;

# Information du programme
print "Vous devez insérer le fichier texte (avec séparateur à virgule) à la racine de C: avant de continuer le lancement du programme !\n";
print "Si vous ne l'avez pas fait, quittez le programme !\n";
system("pause");

# Saisie du nom du fichier d'entrée
print "Saisissez le nom du fichier texte ! ";
chomp(my $name_file=<stdin>);
print "Vous avez saisi : $name_file\n";

# Saisie de l'extension du fichier d'entrée
print "Saisissez l'extension du fichier texte ! ";
chomp(my $name_extension=<stdin>);
print "Vous avez saisi : $name_extension\n";

# Déclaration du fichier d'entrée
# "unless" sert à détecter si le fichier existe ou non
unless (open FILETEXT, my $file = "C:\\${name_file}.${name_extension}")
{
print "Fichier Texte inexistant.\nLe programme va fermer.\n";
system("pause");
# Fermeture du programme
exit();
}
else
{
open FILEXLS,">C:\\${name_file}.xls";
my $file = "C:\\${name_file}.${name_extension}";

while(my $ligne = <FILETEXT>)
{
my ($numclt,$cleclt,$civclt,$nomclt) = split /;/,$ligne;
print "$numclt\n$cleclt\n$civclt\n$nomclt\n";
}

# Fermeture du fichier d'entrée
close FILETEXT;
close FILEXLS;
}

system("pause");
0
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
18 janv. 2008 à 14:22
Bon, j'avance petit à petit.
J'ai réussi à faire ce que je voulais, mais pas dynamiquement.
C'est à dire que je sais par avance le nombre de colonne qu'il y aura dans mon fichier excel lors de sa création, car je sais à l'avance combien de valeur sont délimité dans le fichier texte.
Moi, ce que j'aimerais rendre automatique dans ce code, c'est d'obtenir le fichier excel, sans avoir renseigné en dur dans le code le nombre de variables et donc de colonne.
Merci de votre aide.

Voici où en ait mon code :

use strict;
use warnings;
use Spreadsheet::WriteExcel;

# Information du programme
print "Vous devez insérer le fichier texte (avec séparateur à virgule) à la racine de C: avant de continuer le lancement du programme !\n";
print "Si vous ne l'avez pas fait, quittez le programme !\n";
system("pause");

# Saisie du nom du fichier d'entrée
print "Saisissez le nom du fichier texte ! ";
chomp(my $name_file=<stdin>);
print "Vous avez saisi : $name_file\n";

# Saisie de l'extension du fichier d'entrée
print "Saisissez l'extension du fichier texte ! ";
chomp(my $name_extension=<stdin>);
print "Vous avez saisi : $name_extension\n";

# Initialisation des variables
my $cpt;

# Déclaration du fichier d'entrée
# "unless" sert à détecter si le fichier existe ou non
unless (open FILETEXT, my $file = "C:\\${name_file}.${name_extension}")
{
print "Fichier Texte inexistant.\nLe programme va fermer.\n";
system("pause");
# Fermeture du programme
exit();
}
else
{
my $file = "C:\\${name_file}.${name_extension}";
# Utilisation de la librairie WriteExcel
my $excel = Spreadsheet::WriteExcel->new("C:\\${name_file}.xls");
my $worksheet_excel = $excel->add_worksheet("Fichier Client");
# Parcours du fichier texte
while(my $ligne = <FILETEXT>)
{
# Association des variables aux valeurs à chaque fois qu'il rencontre un ";"
my ($var1,$var2,$var3,$var4) = split /;/,$ligne;
# Incrémentation du compteur
$cpt++;
# Suppression du retour chariot dans un champ
$var4 =~s/\n//;
# Affichage des variables dans les colonnes correspondantes
$worksheet_excel -> write('A'.$cpt, $var1);
$worksheet_excel -> write('B'.$cpt, $var2);
$worksheet_excel -> write('C'.$cpt, $var3);
$worksheet_excel -> write('D'.$cpt, $var4);
}
# Fermeture du fichier d'entrée
close FILETEXT;
}
system("pause");
0
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
22 janv. 2008 à 11:08
Salut à tous.

Y-a-t-il quelqu'un pour m'aider.
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 567
22 janv. 2008 à 12:19
Salut,

voici le fichier sur lequel j'ai tester, donc nombre de colonnes différent pour chaque ligne
à toi d'adapter
root@debian:~/src# cat fichier.csv
a;aa;aaa;aaaa;aaaaa;aaaaaa
b;bb;bbb
c;cc;ccc;cccc
root@debian:~/src# cat ccm2.pl
#!/usr/bin/perl
use strict;use warnings;
use Spreadsheet::WriteExcel;

open LIRE_CSV,"fichier.csv"
    or die "E/S : $!\n";

my $classeur = Spreadsheet::WriteExcel->new("perl.xls");
my $feuille = $classeur->add_worksheet();

while(<LIRE_CSV>){
        chomp;
        my @tmp = split /;/,$_;
        my $c = 0; # colonne commence à zéro
        my $r = $. - 1; # le nombre de ligne correspond au nombre de lignes de .csv -  1 (commence à zéro)
        foreach my $e(@tmp){
                print "$r, $c, $e\n"; # affiche à l'écran ligne, colonne, valeur (pour test) - facultatif
                $feuille->write($r,$c,$e);
                ++$c;
        }
}
__END__
root@debian:~/src#

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
22 janv. 2008 à 15:19
Merci lami20j pour ton aide. Ca marche nikel.
0
Je suis novice en langage C et des forums.

je souhaiterai "lire,crée,modifier" un .TXT converti en .CSV puis .XLS
j'ai lu et essayer de comprendre les indications si dessus mais c'est pour moi du chinois.


fichier .txt

a;aa;aaa;aaaa;aaaaa;aaaaaa
b;bb;bbb
c;cc;ccc;cccc

fichier .CSV

-->matrice

je pense que un rappel des bases (bibliotec... utiliser)

use strict; ?????????
use warnings; ??????????
use Spreadsheet::WriteExcel; ????????


merci d'avance
0