Bonjour,
Désolé d'avoir donné un titre pas très envoutant ou précis à ce post, mais rien d'autre ne m'est venu sur le moment.
Si quelqu'un a une idée, au pire, j'éditerai ...
Je vous détaille donc le problème.
Tout d'abord, je vous situe le contexte : j'ai un fichier nommé donnees.xls, qui est un fichier .txt ayant été renommé en .xls ; c'est un fichier texte, ayant pour séparateur des tabulations, mais s'ouvrant dans excel.
Sur le lieu de mon stage, une machine génère ce fichier. Je ne peux pas faire changer la mise en forme des informations.
Venons au problème ; j'ai récupéré toutes les données qui m'intéressaient via un script perl (pour le moment je bosse avec la console), et parmi ces données se trouvent une colonne assez embêtante.
Elle contient des nombres décimaux (deux chiffres après la virgule) allant de plusieurs milliers à plusieurs centaines de milliers. Il est possible que certains de ces nombres soient même plus grand qu'un million.
A première vue, excel génère des espaces tous les (10^3)^x --> milliers, millions...
Prenons comme valeur récupérée 150 000,00
Lorsque je récupère cette valeur, si je l'affiche, elle sera sous la forme 150á000,00.
Que je la récupère dans une chaîne de caractères ou dans une variable numérique, rien n'y est changé.
J'ai donc tenté des regex pour enlever " á " à la chaîne, idem pour enlever tous les espaces de la chaîne (au cas où ce soit uniquement l'affichage qui pose problème).
Après test (merci les regex), il est apparu que la valeur retournée n'était pas considérée comme numérique.
j'imagine que l'espace visible sur la feuille excel doit être généré par la machine, ou bien par excel.
--> j'ai voulu modifier une des colonnes manuellement pour obtenir un nombre dépassant le million, et l'espace ajouté à la main a correctement été affiché, mais pas l'autre.
Après réflexion, j'ai trouvé deux solutions pour me débarrasser de ce foutu caractère, et encore, une seule me plaît.
- La première, la plus absurde, supprimer les espaces dans le fichier excel via script, ... si ça veut bien marcher, puisque l'expression régulière que j'ai utilisée n'a pas donné le résultat attendu.
- La deuxième est la suivante : obtenir la longueur de chaque chaîne, et ensuite :
Si la longueur de la chaine est de 8 caractères (soit deux chiffres après la virgule, la virgule, trois chiffres, le caractère, et un chiffre de milliers) à 10, supprimer le 7ème caractère en partant de la fin, et si elle est d'au moins 11 caractères, supprimer le 10ème en partant de la fin.
Pas besoin de faire une boucle avec des %3, les chiffres en questions n'atteindront jamais les milliards
Mais, cette solution implique de devoir trifouiller un minimum le code si on décide de rajouter des chiffres après la virgule, par exemple.
C'est pour ça que je viens vous supplier ô humbles collègues développeurs (ou non!) de me dire si vous avez quelque chose de mieux que ma deuxième solution (en espérant qu'elle marche, j'avoue que je ne l'ai pas encore testée).
A titre d'information, je n'ai commencé le perl qu'hier... il est donc possible que des notions basiques qui auraient pu me sortir d'affaire me soient inconnues. Si c'est le cas, je m'en excuse.
(Enfin j'ai fouillé rapidement la FAQ et Google sans trouver de problème pareil donc... =)
Merci d'avance à vous !
Que ce soit pour la lecture du pavé, ou les réponses apportées
Cordialement.
Partager