traitement de texte en masse - Logiciels - Windows & Software
Marsh Posté le 05-07-2005 à 17:50:23
Bonsoir,
Tu as besoin d'apprendre un langage de programmation : il y a un forum http://forum.hardware.fr/hardwaref [...] _sujet.htm
Si tu connais plus ou moins les expressions régulières, Editpad (Pro - 30 jours d'essaie) peut t'aider.
Marsh Posté le 05-07-2005 à 18:25:02
en fait je ne vois pas le rapport avec la programmation : je ne vais pas pondre un soft en turbopascal pour parcourir mon fichier, d'autant qu'il n'y a pas une ligne identique, et qu'il n'y a pas un mot identique, que les coupures ne sont pas toutes au même endroit...
Marsh Posté le 05-07-2005 à 18:30:07
Pas un soft mais un script.
Et puis pas de mot identique mais il doit y avoir un certain "format", parce que sinon je ne vois pas comment tu peux t'en sortir
Marsh Posté le 05-07-2005 à 20:48:33
Pas évident ton truc.
Tu n'aurais pas Access par hazard ? Parce qu'alors ce serait très facile à faire.
Je bosse sur ton problème, mais en VBA dans Excel.
Je reviens demain.
A+
Marsh Posté le 05-07-2005 à 22:06:04
Au niveau de la structure, tu as bien une ligne avec un seul champ suivie de plusieures lignes comportant X champs ?
Marsh Posté le 05-07-2005 à 22:22:08
Si c'est le cas, tu installes Cygwin ou n'importe quel package permettant d'utiliser la commande AWK (ou NAWK, GAWK, ...) sous windows et tu peux faire ça en une simple commande:
$ cat input.txt
blablabla |
$ awk 'NF == 1 { print $0 ; next } { print "\t"$1"\n\t"$2" "$3" "$4" "$5"\n\t"$6"\n" }' input.txt
blablabla |
C'est la méthode la plus simple et la plus rapide ... car AWK est fait pour ce genre de traitement.
Comme dans ton exemple je ne sais pas si tu veux une ligne vierge entre la première et la seconde (tes deux exemples sont différents) tu peux ajouter cette ligne en remplaçant le { print $0 ; next } par { print $0"\n" ; next }
Marsh Posté le 05-07-2005 à 23:32:35
wackevat a écrit : Pas un soft mais un script. |
oui, le format que j'ai indiqué juste au dessus
Marsh Posté le 05-07-2005 à 23:32:46
Papy Octet a écrit : Pas évident ton truc. |
je t'en remercie
Marsh Posté le 05-07-2005 à 23:33:27
Deadlock a écrit : Si c'est le cas, tu installes Cygwin ou n'importe quel package permettant d'utiliser la commande AWK (ou NAWK, GAWK, ...) sous windows et tu peux faire ça en une simple commande:
|
j'ai un linux a mes cotés, je vais tester ça dès mon arrivée au taf
Marsh Posté le 05-07-2005 à 23:34:19
par contre deadlock, tu pourrais m'expliquer le fonctionnement de ta ligne de commande s'il te plait?
Marsh Posté le 06-07-2005 à 08:22:42
Krapaud a écrit : par contre deadlock, tu pourrais m'expliquer le fonctionnement de ta ligne de commande s'il te plait? |
C'est assez basic comme AWK. AWK fait du traitement séquentiel sur des fichiers texte. Il commence par la première ligne et applique les règles définies ligne par ligne. $0 représente la ligne complète, $1 à $n représentent les champs de cette ligne séparés par la variable FS (Field separator) qui par défaut utilise l'espace ou la TAB, FS n'est donc pas renseigné dans cet exemple car induit. NF retourne le nombre de champs dans la ligne en cours ($0).
La commande que je t'ai donnée est un simple IF ... THEN ... ELSE
NF == 1 -> Si le nombre de champs est égal à 1
{ print $0 ; next } -> Alors affiche la ligne complète et passe à la suivante
{ print "\t"$1"\n\t"$2" "$3" "$4" "$5"\n\t"$6"\n" } -> Dans le cas contraire (nombre de champs différent de 1) affiche une TAB + champ1 + CR + TAB + champ2 + SPC + champ3 + SPC + champ4 + SPC + champ5 + CR + TAB + champ6 + CR
Et ainsi de suite ...
Mais encore une fois c'est un AWK des plus simples, le AWK est proche du C avec des clauses BEGIN/END, des tableaux multi-dim, des boucles, traitment NUM/STR, incrémentations (i++, ++i, i--, ...) etc, etc, ...
Marsh Posté le 06-07-2005 à 12:49:04
je nai qu'une chose à dire :
ça marche presque, j'ai une ou deux modifs à faire mais c'est ça
Marsh Posté le 06-07-2005 à 12:53:30
Si tu as des exceptions (lignes vides, test sur certains champs, ...) donne les moi et je les prendrais en compte. Ca peut être utile si tu dois faire ce traitement plusieures fois.
Marsh Posté le 06-07-2005 à 12:54:23
Krapaud a écrit : par contre ça me supprime des éléments |
Ah bon ? Ton exemple ne dois pas être suffisant pour déduire la structure alors.
Marsh Posté le 06-07-2005 à 13:00:51
En fait je ne pense pas qu'il supprime des éléments mais si une ligne vierge est présente dans le fichier source celà va afficher 4 lignes vides (comme s'il manquait un élément). Tu peux ajouter un test au début pour éviter ça:
awk 'length($0) == 0 { next } NF == 1 { print $0 ; next } { print "\t"$1"\n\t"$2" "$3" "$4" "$5"\n\t"$6"\n" }' input.txt
Marsh Posté le 06-07-2005 à 13:00:52
comme je te le disais, y'a un gros problème de mise en forme dans le document :
|
Marsh Posté le 06-07-2005 à 13:02:26
Deadlock a écrit : En fait je ne pense pas qu'il supprime des éléments mais si une ligne vierge est présente dans le fichier source celà va afficher 4 lignes vides (comme s'il manquait un élément). Tu peux ajouter un test au début pour éviter ça: |
sisi, il supprime des éléments, par exemple, un truc qui commence par LA POSTE va se transformer en OSTE
Marsh Posté le 06-07-2005 à 13:03:57
désolé pour le spoiler mais j'ai pas le choix
sinon comme tu peux le constater :
- les catégories peuvent contenir des espaces
- les numéros de téléphone sont soit séparés par des points, soit par des espaces
- les adresses peuvent contenir un "bis" "b" ou autre truc du genre
Marsh Posté le 06-07-2005 à 13:08:05
Krapaud a écrit : désolé pour le spoiler mais j'ai pas le choix |
Ah ben ouais on est loin de l'exemple dans ce cas ... tu as des champs de taille variable et surtout avec un nombre de mots non-statique
Tu sais pas le générer depuis Excel avec des séparateurs fixes (la virgule ou le point virgule) ?
Marsh Posté le 06-07-2005 à 13:10:03
Tu veux mon mail (MP) pour m'envoyer un morceau de fichier valide ? Parce qu'à faire du copy/paste ça bouffe les TAB et les transforme en SPC souvent ...
Je te fais ça dans l'après-midi j'ai un peu de temps aujourd'hui
Marsh Posté le 06-07-2005 à 14:49:16
Deadlock a écrit : Ah ben ouais on est loin de l'exemple dans ce cas ... tu as des champs de taille variable et surtout avec un nombre de mots non-statique |
si, aucun problème pour ça
Marsh Posté le 06-07-2005 à 14:49:38
Deadlock a écrit : Tu veux mon mail (MP) pour m'envoyer un morceau de fichier valide ? Parce qu'à faire du copy/paste ça bouffe les TAB et les transforme en SPC souvent ... |
ah je veux bien si ça ne te dérange pas
Marsh Posté le 05-07-2005 à 16:49:42
le titre du sujet est explicite, désolé j'ai pas trouvé mieux.
En fait j'ai un problème :
j'ai un fichier excel de quelques miliers de lignes formaté de la façon suivante :
blablabla
doudoudou 1 dodo xxxxx tatata 0000000000
doudoudou 1 dodo xxxxx tatata 0000000000
doudoudou 1 dodo xxxxx tatata 0000000000
blublublu
doudoudou 1 dodo xxxxx tatata 0000000000
doudoudou 1 dodo xxxxx tatata 0000000000
doudoudou 1 dodo xxxxx tatata 0000000000
Tout ça dans un document excel
Je souhaite obtenir le résultat suivant :
blablabla
doudoudou
1 dodo xxxxx tatata
0000000000
doudoudou
1 dodo xxxxx tatata
0000000000
doudoudou
1 dodo xxxxx tatata
0000000000
blublublu
doudoudou
1 dodo xxxxx tatata
0000000000
doudoudou
1 dodo xxxxx tatata
0000000000
doudoudou
1 dodo xxxxx tatata
0000000000
Mais la blague c'est que je veux cette disposition pour toutes les lignes, sans que ça apparaisse dans un tableau, grosso modo un truc au kilomètre quoi.
Pour le passage de excel (tableau) vers du word (sans tableau) je suis passé par un fichier CSV (avec openoffice) et j'ai donc une mise en page valable dans word.
Maintenant si je veux ma 'bonne' disposition je prends textpad et je me farçis toutes les lignes les unes après les autres.
Vous ne connaitriez pas une méthode plus rapide?
Merci!