Modif des caractères d'un xls/csv 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 - 4 oct. 2007 à 13:54
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009 - 4 oct. 2007 à 17:01
Bonjour,

J'ai un dernier problème sur le travail de récupération des données d'un xls vers un csv. Il s'agit des caractères spéciaux.

Un extrait de mon fichier xls (fichier d'entrée)
SU1107 29 ACCESSOIRES ENTRETIEN 071115173 Sacs poubelle 2 nœuds 100 % biodégradable

Un extrait de mon fichier csv (fichier de sortie)
SU1107;29;ACCESSOIRES ENTRETIEN;071115173;SNULaNULcNULsNUL NULpNULoNULuNULbNULeNULlNULlNULeNUL NUL2NUL NULnSOHSNULuNULdNULs...

Le champ, dans le xls contient le caractère "œ". Et dans mon csv, il me sort la ligne du dessus. Le "NUL" est écrit en blanc sur un fond noir (je peux pas le copier/coller sur le site), et au niveau du caractère, il me le retranscrit en "SOH" (blanc sur fond noir) & "S" & "NUL" (blanc sur fond noir).

Qui sait quoi utiliser comme fonction pour récupérer le même caractère dans mon csv (dans le meilleur des cas) ou le remplacer par "oe" (dans le pire des cas), et si il existe une fonction générique pour tous les caractères spéciaux ou si il faut en faire une pour chaque caractère. Car, à l'heure actuelle, je n'ai rencontré que celui, mais il se pourrait qu'il y en ait d'autres dans le futur.

Merci d'avance de votre aide.
A voir également:

11 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 567
4 oct. 2007 à 14:41
Salut,

tu ouvres avec quoi ton .csv?
envoi ton fichier xls entier ainsi que le .csv que tu as obtenu
ça nous fera gagner de temps ;-)
0
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
4 oct. 2007 à 14:58
Je viens de mettre les extraits de fichiers dans cjoint.com

https://www.cjoint.com/?keo3qkbn1X pour le fichier csv

https://www.cjoint.com/?keo4cUWzZ8 pour le fichier xls
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
4 oct. 2007 à 16:00
essaie
#!/usr/bin/perl
use strict;use warnings;
use Spreadsheet::ParseExcel;

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

my $file = "Test.xls";
#my $file = "Test.xls";
my $excel = Spreadsheet::ParseExcel::Workbook->Parse($file);
my $sheet = ${$excel->{Worksheet}}[0];

foreach my $row (0 ... 2 ){
  my $cell1 = $sheet->{Cells}[$row][0];
  my $cell2 = $sheet->{Cells}[$row][1];
  my $cell3 = $sheet->{Cells}[$row][2];
  my $cell4 = $sheet->{Cells}[$row][3];
  my $cell5 = $sheet->{Cells}[$row][4];

  my $res = "$cell1->{Val};$cell2->{Val};$cell3->{Val};$cell4->{Val};$cell5->{Val};";
  $res =~s/\n//;
  $res =~s/\x01\x53/oe/g;
  print "$res\n";
}
__END__

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
4 oct. 2007 à 16:08
mais ça ne marchera sur tout le fichier
si tu ne me donne que des extraits alors tu n'auras pas la solution complète
Le caractère SOH -> code ascii 01 correspond au Début d'en-tête (voir la table ASCII)
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
4 oct. 2007 à 16:09
Ca marche à moitié. Je m'explique. Voici ce que j'obtiens dans mon csv

NULnoeNULuNULdNULs

Avant, j'avais NULnSOHSNULuNULdNULs.

Tu as réussi à enlever le SOHS. Mais, j'ai toujours mes valeurs NUL que je ne veux pas.

Comment faire ?
0
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
4 oct. 2007 à 16:12
Le problème, c'est que je ne peux pas te passer le fichier complet pour des raisons de confidentialité. Désolé.
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
4 oct. 2007 à 16:20
c'est que je ne peux pas te passer le fichier complet pour des raisons de confidentialité
je te comprends ;-)

tu ouvres avec quoi le csv?
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
4 oct. 2007 à 16:23
essaie
#!/usr/bin/perl
use strict;use warnings;
use Spreadsheet::ParseExcel;

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

my $file = "Test.xls";
#my $file = "Test.xls";
my $excel = Spreadsheet::ParseExcel::Workbook->Parse($file);
my $sheet = ${$excel->{Worksheet}}[0];

foreach my $row (0 ... 2 ){
  my $cell1 = $sheet->{Cells}[$row][0];
  my $cell2 = $sheet->{Cells}[$row][1];
  my $cell3 = $sheet->{Cells}[$row][2];
  my $cell4 = $sheet->{Cells}[$row][3];
  my $cell5 = $sheet->{Cells}[$row][4];

  my $res = "$cell1->{Val};$cell2->{Val};$cell3->{Val};$cell4->{Val};$cell5->{Val};";
  $res =~s/\n//;
  $res =~s/\x01\x53/oe/g;
  $res =~s/\x00//g;
  print "$res\n";
}
__END__

0
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
4 oct. 2007 à 16:36
Alors premièrement, j'ouvre mes .csv avec notepad++ et deuxièmement, merci. Je n'ai plus les NUL.
Et troisièmement, est-ce que tu peux me détailler les caractéristiques de :
$res =~s/\x01\x53/oe/g;
$res =~s/\x00//g;

Merci
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
4 oct. 2007 à 16:42
Dans une expression régulière on peut écrire le caractère de façon littérale, octale et héxadecimale

Donc le caractère NUl en hexa = 00
Le caractère SOH en hexa = 01
et le caractère S en hexa = 53

La notation est \xNN
\x01\x53

c'est
SOHS
0
VivoBaggio Messages postés 140 Date d'inscription jeudi 27 octobre 2005 Statut Membre Dernière intervention 23 janvier 2009
4 oct. 2007 à 17:01
Et ben je dis RESPECT TOTAL. Merci
0