Rechercher : dans
Par :

Modif des caractères d'un xls/csv en perl

Dernière réponse le 4 oct 2007 à 17:01:35 VivoBaggio, le 4 oct 2007 à 13:54:40 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP
Firefox 2.0.0.7

Meilleures réponses pour « Modif des caractères d'un xls/csv en 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...
Transformer un fichier Microsoft Excel (.xls) en PDF VoirTransformer en fichier PDF un fichier Microsoft Excel (.xls) Rien de plus simple ! Ouvrez votre fichier *.xls avec OpenOffice.org Réglez éventuellement la mise en page par le menu Format / Page... Dès lors, 2 solutions pour transformer en...
[CCM] Utiliser des caractères spéciaux VoirVous pouvez utiliser des caractères spéciaux dans vos messages sur les forums de CCM. Vous pouvez: Soit utiliser la table de caractères Windows (charmap.exe) et copier-coller les caractères dans le message. Soit utiliser les entités...
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...
Perl - Caractéristiques du langage VoirFichier source, et interprétation Le fichier source d'un programme écrit en Perl est un simple fichier texte dont l'extension est par convention .pl. Ce fichier source doit être un fichier texte non formatté, c'est-à-dire un fichier texte dans sa...
Caractères spéciaux HTML VoirCodage des caractères spéciaux Le standard HTML demande de respecter le codage des caractères ASCII 7 bits, c'est-à-dire que les caractères accentués ne sont pas autorisés. Il faut pour cela utiliser un codage particulier. Pour...

1

lami20j, le 4 oct 2007 à 14:41:48

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 ;-)
lami20j

Répondre à lami20j

2

VivoBaggio, le 4 oct 2007 à 14:58:51

Je viens de mettre les extraits de fichiers dans cjoint.com

http://cjoint.com/?keo3qkbn1X pour le fichier csv

http://cjoint.com/?keo4cUWzZ8 pour le fichier xls

Répondre à VivoBaggio

3

lami20j, le 4 oct 2007 à 16:00:43

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__

lami20j

Répondre à lami20j

4

lami20j, le 4 oct 2007 à 16:08:51

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) lami20j

Répondre à lami20j

5

VivoBaggio, le 4 oct 2007 à 16:09:12

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 ?

Répondre à VivoBaggio

6

VivoBaggio, le 4 oct 2007 à 16:12:23

Le problème, c'est que je ne peux pas te passer le fichier complet pour des raisons de confidentialité. Désolé.

Répondre à VivoBaggio

7

lami20j, le 4 oct 2007 à 16:20:06

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? lami20j

Répondre à lami20j

8

lami20j, le 4 oct 2007 à 16:23:55

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__

lami20j

Répondre à lami20j

9

VivoBaggio, le 4 oct 2007 à 16:36:18

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

Répondre à VivoBaggio

10

lami20j, le 4 oct 2007 à 16:42:33

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 lami20j

Répondre à lami20j

11

 VivoBaggio, le 4 oct 2007 à 17:01:35

Et ben je dis RESPECT TOTAL. Merci

Répondre à VivoBaggio