Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/08/2014, à 16:42

soupaloignon

[Résolu] Script à réaliser : Que pensez vous de la progression

Bonjour à tous,

J'ai un traitement à faire sur des fichiers contenant un nombre X de blocs de 3 lignes, organisés comme ci-dessous :

;;;INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;;
;;;;;;75000 PARIS;;;;
;;;;;;;;;;

A final je voudrai obtenir chaque bloc de 3 lignes en 1 ligne, avec ces infos (l'ordre des infos n'as pas d'importance)

Aa Intitule 1;60001;M Nom Prénom;29 Rue De La Gare;03 55 55 55 55;03 66 66 66 66;75000;Paris;29 Rue De La Gare;75000;Paris;prenom.nom@nom-de-domaine.fr


Il y a donc toute une série de transformation à faire. Pour la plupart j'ai déjà des idées, mais ce qui me manque surtout dans un premier temps c'est une logique de travail. Et c'est pour cette logique que je vous demande votre avis.

1/ Réduire le bloc de 3 lignes à 2 + suppression de chaque ligne vide

sed -e "s/;;;;;;;;;;//g" 
sed '/^$/d'

;;;INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;;
;;;;;;75000 PARIS;;;;


2/ Supprimer le motif ";;;;;;" (qui se trouve au début de chaque ligne paire)

sed -e "s/;;;;;;//g" 

;;;INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;;
75000 PARIS;;;;


3/ Chaque ligne paire, qui commence par un code postal à 5 chiffres, remplacer l'espace situé après le 5éme chiffre par un ";"

Ca je ne sais pas faire

;;;INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;;
75000;PARIS;;;;


4/ Retirer le motif ";;;" à chaque ligne impaire et le remplacer par un le motif "AA "

sed -e "s/;;;/AA /g" 

AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;;
75000;PARIS;;;;


5/ Toutes les lignes paires remplacer le motif ";;;;" par ";"

sed -e "s/;;;;/;/g"

AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;;
75000;PARIS;


6/ Chaque ligne impaire remplacer le motif ";;" par ";"

sed -e "s/;;/;/g"

AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;
75000;PARIS;


7/ Joindre 2 lignes en 1 seule

sed '$!N;s/\n/ /'

AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;75000;PARIS;


8/ Trouver les séquences de 9 chiffres (il y en a 2), rajouter un 0 devant chaque séquence, ajouter ensuite un espace tous les 2 chiffres (sauf le dernier bloc de 2 chiffres mais au pire un sed -e "s/ ;//g" peut régler le problème)

Ca je ne sais pas faire

: rajouter un 0 devant chaque séquence, ajouter ensuite un espace tous les 2 chiffres

AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;03 55 55 55 55;03 66 66 66 66;75000;PARIS;


9/ Doubler les adresses  (pour l'import dans un autre logiciel, il y a 3 champs livraison, et 3 champs facturation : adresse, cp, ville. Qui là seront identiques)

AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;03 55 55 55 55;03 66 66 66 66;75000;PARIS;29 RUE DE LA GARE;75000;PARIS;

Ca je ne sais pas faire

10/ utiliser le 3ème champs "M NOM Prénom" pour composer une adresse mail de la forme Prénom.NOM@nom-de-domaine.fr
Passer en minuscules et sans caractères accentués

Ca non plus je ne sais pas faire (je traiterai à la mains les cas de figure avec Nom composés et/ou prénoms composés)

AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;03 55 55 55 55;03 66 66 66 66;75000;PARIS;29 RUE DE LA GARE;75000;PARIS;prenom.nom@nom-de-domaine.fr

11/ tout passer en casse de titre, sauf l'adresse  mail

Ca non plus je ne sais pas faire

Aa Intitule1;60001;M Nom Prénom;29 Rue De La Gare;03 55 55 55 55;03 66 66 66 66;75000;Paris;29 Rue De La Gare;75000;Paris;prenom.nom@nom-de-domaine.fr


Fin du traitement



Quand j'écris "Ca je ne sais pas faire" c'est dans le sens où je n'ai pas encore cherché des infos sur le net. Je pense que pour certaines choses je trouverai, et pour d'autres je posterai une demande d'aide sur le forum wink


Mais la question principale est de savoir si la progression listée est bonne, ou s'il y a mieux à faire


Merci d'avoir lu ce post jusqu'au bout wink, et merci d'avance pour vos réponses

Dernière modification par soupaloignon (Le 09/08/2014, à 19:38)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#2 Le 06/08/2014, à 17:22

Brunod

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Perso je commencerais par alléger le fichier : suppression de tous les ";" répétitifs et de tous ceux en début de ligne. Du même coup ça te ramène tes trois lignes à deux.
Ensuite je ne comprends pas pourquoi tu dois doubler l'adresse.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#3 Le 06/08/2014, à 17:38

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Merci pour ta réponse,

Brunod a écrit :

Perso je commencerais par alléger le fichier : suppression de tous les ";" répétitifs et de tous ceux en début de ligne. Du même coup ça te ramène tes trois lignes à deux.

Oui, ça c'est la partie 1 à 7


Brunod a écrit :

Ensuite je ne comprends pas pourquoi tu dois doubler l'adresse.

Parce qu'ensuite, pour l'import dans un autre logiciel, il y a 3 champs livraison, et 3 champs facturation : adresse, cp, ville (qui là seront identiques)
Je met à jour le post initial avec cette info

Dernière modification par soupaloignon (Le 06/08/2014, à 17:38)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#4 Le 06/08/2014, à 17:46

Brunod

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

soupaloignon a écrit :

Merci pour ta réponse,

Brunod a écrit :

Perso je commencerais par alléger le fichier : suppression de tous les ";" répétitifs et de tous ceux en début de ligne. Du même coup ça te ramène tes trois lignes à deux.

Oui, ça c'est la partie 1 à 7
...

Ce que je voulais dire, c'est qu'en supprimant les ; répétitifs et en début de ligne, ça te fait 2 opérations qui vont directement t'éviter de ramener tes 3 lignes à deux puisque ce sera fait en même temps. Donc inutile de ramener 3 lignes à 2 par une opération distincte.
Edit :
Un truc du style :
sed -e "s/^;*//g"
puis
sed "s/;*/;/"
À tester pour voir si le retour à la ligne de la 3eme ligne disparaît bien.

Dernière modification par Brunod (Le 06/08/2014, à 17:59)


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#5 Le 06/08/2014, à 19:26

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Bonsoir,
Tout n'y est pas, mais ça peut te donner des idées.
À partir de ton exemple du début, voici ce qu'on peut obtenir :

$ sed -rn '/^;+$/d;s/^;+/AA /;N;s/;*\n;*/;/;s/;*$/;/p' fichier
AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE;355555555;366666666;75000 PARIS;
$ sed -rn '/^;+$/d;t;s/^;+/AA /;N;s/;*\n;*/;/;s/;*$/;/p' fichier|awk -F";" -v OFS=";" '{$5="0"$5;gsub(".."," &",$5);$6="0"$6;gsub(".."," &",$6);sub(" ",";",$7);$8=$4";"$7;print}'
AA INTITULE1;60001;M NOM Prénom;29 RUE DE LA GARE; 03 55 55 55 55; 03 66 66 66 66;75000;PARIS;29 RUE DE LA GARE;75000;PARIS

Il serait, je pense, plus commode de le faire en python.

Hors ligne

#6 Le 07/08/2014, à 08:38

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Bonjour pingouinux, et merci pour ta réponse.

Tu as vraiment l'art et la manière d'écrire des scripts d'une ligne de folie, et qui fonctionnent à chaque fois. C'est encore le cas, un grand merci smile

Pour l'adresse mail je laisse tomber la possibilité d'automatiser quelque chose. Les cas de figure ou il y a simplement Nom et Prenom sont finalement minoritaires. C'est beaucoup plus souvent un double Nom et/ou prenom composé. Je le ferai manuellement.

j'avais commencé un bout de script de mon coté qui en fait fonctionnait plutôt bien. Je ne traitais pas encore tout ce que je voulais, mais ça avançait. Rien à voir par rapport au tien par contre.

Alors bien évidement je vais utiliser ta ligne mais il y a des choses que j'aimerai comprendre, si tu as un peu de temps. Et notamment la décomposition de cette commande :

sed -rn '/^;+$/d;t;s/^;+/AA /;N;s/;*\n;*/;/;s/;*$/;/p'

Merci d'avance


>> Brunod
Merci pour tes retours. Dans certaines des différentes portions de code que j'ai testé j'avais suivi cette piste.


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#7 Le 07/08/2014, à 10:10

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Et notamment la décomposition de cette commande :

sed -rn '/^;+$/d;t;s/^;+/AA /;N;s/;*\n;*/;/;s/;*$/;/p'

Voir man sed.
/^;+$/d;
Suppression des lignes contenant 1 ou plus ";"
t;
Si la chaîne précédente a été trouvée, on se débranche à la fin des commandes
s/^;+/AA /;
Remplacement de 1 ou plus ";" en début de ligne par "AA "
N;
La ligne suivante est ajoutée au "pattern space", qui contient maintenant 2 lignes
s/;*\n;*/;/;
Remplacement de 0 ou plus ";" à la fin de la 1ère ligne et au début de la 2ème, ainsi que le "\n" à la fin de la 1ère ligne, par 1 seul ";". Les 2 lignes sont ainsi fusionnées en 1 seule
s/;*$/;/p'
Remplacement de 0 ou plus ";" à la fin de la ligne par 1 seul ";", et impression du résultat

Voici un script en python3 qui devrait faire ce que tu veux :

#!/usr/bin/python3

import sys, re

rec=re.compile(';+([^\n]+;);+\n;+([^\n]+?);+\n;+\n')

#  Première lettre de chaque mot en majuscule, les autres en minuscule
def capit(s) :
    ret=[]
    for k in s.split() : ret.append(k.capitalize())
    return ' '.join(ret)

# Mise en forme du numéro de téléphone
def tel(s) :
    ret='0'+s[0]
    for k in range(1,len(s),2) : ret+=" %s"%s[k:k+2]
    return ret

# Suppression des accents (liste à compléter éventuellement)
def no_accent(s) :
    for p,r in ( ('[àâ]',  'a')
               , ('[éèêë]','e')
               , ('[îï]',  'i')
               , ('[ôö]',  'o')
               , ('[ùûü]', 'u')
               ) :
        k=re.search(p,s)
        if k : s=re.sub(k.group(0),r,s)
    return s

with open(sys.argv[1],'r') as f : fic=f.read()

while True :
   k=rec.search(fic)
   if(k) :
    # 3 lignes regroupées en 1 seule
      lig="AA %s%s\n"%(k.group(1),k.group(2))
      intit,num,nom_prenom,adrs,tel1,tel2,code_ville=map(capit,lig.split(";"))
      bid,nom,prenom=nom_prenom.split()
    # Mise en forme des numéros de téléphone
      tel1,tel2=map(tel,(tel1,tel2))
      code,ville=code_ville.split()
    # Suppression des accents dans l'adresse mail
      mail=no_accent("%s.%s@nom-de-domaine.fr"%(prenom.lower(),nom.lower()))
      sys.stdout.write("%s\n"%";".join((intit,num,nom_prenom,adrs,tel1,tel2,code,ville,adrs,code,ville,mail)))
      fic=fic[k.end(0):]
   else :
      break

à appeler ainsi :

./le_script fichier

et voici le résultat sur ton exemple :

Aa Intitule1;60001;M Nom Prénom;29 Rue De La Gare;03 55 55 55 55;03 66 66 66 66;75000;Paris;29 Rue De La Gare;75000;Paris;prenom.nom@nom-de-domaine.fr

Hors ligne

#8 Le 07/08/2014, à 12:23

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Merci pour le détail de la commande sed, je suis en train d'éplucher ça

Et un grand merci pour le script python, effectivement cela a l'air très puissant, par contre je n'y entend rien dans ce language ...

Ce qui ne m'a pas empéché d'installer le script par contre et de le tester, par contre il n'y a pas de résultat. Je te fais la liste des manips que j'ai fait, peut être y a t'il quelque chose que je n'ai pas fait correctement.

1er point, je n'ai jamais rien installé de particulier au niveau de python, donc mon système est natif d'install pour ce language. Je suis sous Mint 15 (base ubuntu 13.04)

Donc j'ai copié ton code dans un fichier, l'ai rendu exécutable.
J'ai mis le script dans un dossier, qui contenait également un autre fichier (01.csv) contenant les infos brutes à traiter
Ouverture d'un terminal dans ce dossier et ligne de commande : ./script-2 01.csv
Le terminal redonne la main, mais le fichier 01.csv n'a pas bougé

J'ai refait un test avec ./script-2 01.csv > 02.csv
02.csv est vide

Un autre test avec juste : ./script-2
Traceback (most recent call last):
  File "./script-2", line 31, in <module>
    with open(sys.argv[1],'r') as f : fic=f.read()
IndexError: list index out of range


Qu'en penses tu ?


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#9 Le 07/08/2014, à 12:48

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Tu peux vérifier que python3 est installé, mais je pense que oui :

type python3

Peux-tu montrer ton fichier 01.csv ? Je vais faire des tests.

Hors ligne

#10 Le 07/08/2014, à 13:14

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

oui c'est installé :
type python3
python3 est /usr/bin/python3

Je t’envoie un lien par Mp pour récupérer le fichier


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#11 Le 07/08/2014, à 14:04

bruno

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Avant de te battre avec bash, sed, ou de réinventer la roue avec du Python, as-tu regardé les outils de manipulation de fichiers CSV ?
Comme ffe par exemple.

Dernière modification par bruno (Le 07/08/2014, à 14:06)

Hors ligne

#12 Le 07/08/2014, à 14:22

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

@soupaloignon :
La syntaxe de ton nouveau fichier est différente de celle que tu donnes en #1 (";;" à la fin de la 1ère ligne).
J'ai aussi pris en compte le fait que le champ nom_prenom peut contenir plus de 3 mots, et que le champ code_ville peut en contenir plus de 2, ce qui produisait des erreurs.
Voici une version corrigée :

#!/usr/bin/python3

import sys, re

rec=re.compile(';+([^\n]+?);*\n;+([^\n]+?);+\n;+\n')

#  Première lettre de chaque mot en majuscule, les autres en minuscule
def capit(s) :
    ret=[]
    for k in s.split() : ret.append(k.capitalize())
    return ' '.join(ret)

# Mise en forme du numéro de téléphone
def tel(s) :
    ret='0'+s[0]
    for k in range(1,len(s),2) : ret+=" %s"%s[k:k+2]
    return ret

# Suppression des accents (liste à compléter éventuellement)
def no_accent(s) :
    for p,r in ( ('[àâ]',  'a')
               , ('[éèêë]','e')
               , ('[îï]',  'i')
               , ('[ôö]',  'o')
               , ('[ùûü]', 'u')
               ) :
        k=re.search(p,s)
        if k : s=re.sub(k.group(0),r,s)
    return s

with open(sys.argv[1],'r') as f : fic=f.read()
#print(fic);sys.exit()

while True :
   k=rec.search(fic)
   if(k) :
    # 3 lignes regroupées en 1 seule
      lig="AA %s;%s\n"%(k.group(1),k.group(2))
      intit,num,nom_prenom,adrs,tel1,tel2,code_ville=map(capit,lig.split(";"))
      npspl=nom_prenom.split()
      nom,prenom=npspl[1],"_".join(npspl[2:])
    # Mise en forme des numéros de téléphone
      tel1,tel2=map(tel,(tel1,tel2))
      cvspl=code_ville.split()
      code,ville=cvspl[0],"_".join(cvspl[1:])
    # Suppression des accents dans l'adresse mail
      mail=no_accent("%s.%s@nom-de-domaine.fr"%(prenom.lower(),nom.lower()))
      sys.stdout.write("%s\n"%";".join((intit,num,nom_prenom,adrs,tel1,tel2,code,ville,adrs,code,ville,mail)))
      fic=fic[k.end(0):]
   else :
      break

@bruno : Je ne connais pas ffe, et me sers des outils dont j'ai l'habitude

Hors ligne

#13 Le 07/08/2014, à 15:22

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

pingouinux a écrit :

La syntaxe de ton nouveau fichier est différente de celle que tu donnes en #1 (";;" à la fin de la 1ère ligne).

Oup's oui, désolé. J'avais oublié de modifier le post initial. En fait le post initial est un fichier csv exporté à partir d'excel (le fichier natif est au format xls.
Celui que je t'ai envoyé, et sur lequel je faisais mes tests, est un export csv à partir de calc, de Libre Office. Et il est différent, ce qui est quand même bizarre.

pingouinux a écrit :

J'ai aussi pris en compte le fait que le champ nom_prenom peut contenir plus de 3 mots, et que le champ code_ville peut en contenir plus de 2, ce qui produisait des erreurs.
Voici une version corrigée :

Et le résultat fonctionne superbement, un grand merci smile


>> bruno
Je ne connaissais pas, merci pour l'info, cela a l'air intéressant.

Dernière modification par soupaloignon (Le 07/08/2014, à 15:26)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#14 Le 07/08/2014, à 16:27

melixgaro

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Salut,

à pingouinux

Je crois que je te l'ai déjà dit, mais je suis toujours aussi admiratif de tes lignes de commandes alliant un peu de sed, un peu de grep, un peu de awk.
Et merci pour les explications détaillées de ta ligne sed.
J'ai une question, pourquoi dans ton script python utilises-tu sys.stdout.write au lieu de print pour l'impression du résultat ? Y a-t-il une vraie raison à préférer l'un à l'autre ?


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#15 Le 07/08/2014, à 16:41

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

melixgaro #14 a écrit :

J'ai une question, pourquoi dans ton script python utilises-tu sys.stdout.write au lieu de print pour l'impression du résultat ? Y a-t-il une vraie raison à préférer l'un à l'autre ?

C'est simplement que mon script initial écrivait sur un fichier ouvert avec g=open(…), et je me suis contenté de remplacer g.write par sys.stdout.write. On pourrait parler de flemme… smile

Hors ligne

#16 Le 07/08/2014, à 16:44

melixgaro

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

ok, je comprends maintenant
ciao wink


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#17 Le 08/08/2014, à 18:06

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Hello pingouinux,

Est ce que je peux "t'ennuyer" un peu plus pour ce script en python ?

En fait je viens de découvrir que dans le champs "NOM Prénom" il y avait parfois, assez souvent même en fait, des informations en plus. Elles sont structurées d'une manière qui devrait permettre de les retirer assez facilement via un bout de code.

M NOM RPT SARL ROTH 2000 Prénom
M NOM RPT SARL ROTH 2000 Prénom-composé

Les informations en trop commencent à RPT (cela commence toujours ainsi) et se terminent donc juste avant le dernier mot du champ, ou juste avant le dernier mot composé du champ (séparation "-").

Le résultat final pour le champ NOM Prénom, avant la transformation pour l'adresse mail, serait donc :

M NOM Prénom
M NOM Prénom-composé

Je ne doute pas de tes capacité à rajouter un tel bout de code, la question serait plutôt de savoir si tu en as le temps et/ou l'envie wink

Dernière modification par soupaloignon (Le 08/08/2014, à 18:07)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#18 Le 08/08/2014, à 19:22

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Salut soupaloignon,
Voici une façon de faire, sans tenir compte de "RPT". Je prends comme nom le deuxième mot du champ "NOM Prénom", et comme prénom le dernier.
Si ça te convient, tu remplaces cette ligne

      nom,prenom=npspl[1],"_".join(npspl[2:])

par celle-ci (attention, garder les espaces en début de ligne tels qu'ils sont)

      nom,prenom=npspl[1],npspl[-1]

Vérifie aussi les noms de villes. Lorsque ce nom est composé de plusieurs mots, dans mon script en #12, je remplace les espaces par des "_", ce qui n'est paut-être pas très futé.

Hors ligne

#19 Le 08/08/2014, à 22:01

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Hello,

pingouinux a écrit :

Salut soupaloignon,
Voici une façon de faire, sans tenir compte de "RPT". Je prends comme nom le deuxième mot du champ "NOM Prénom",

Non, ça pourra pas fonctionner. Mais c'est de ma faute, au moment où j'ai écrit le précédent message ce cas de figure ne c'était pas présenté. Parfois il y a 2 noms de famille. Genre : TROUDUC MACHERE RPT SARL ROTH 2000 Jean-Maximilien

Ou plus vicelard : DE LA TROUDUC MACHERE RPT SARL ROTH 2000 Jean-Maximilien

Donc je ne vois pas d'autres solutions que d'avoir pour référence le  "RPT", qui permet de gérer un nombre X de noms de famille. Biens ur sur cela met le bronx dans les adresses mails, mais ce n'est pas grave, je ferai les rectifs à la main. Si déjà les "NOMS Prénoms" sont bons, c'est le principal.


pingouinux a écrit :

et comme prénom le dernier.

Mais en faisant ça tu prendrais sur un prénom de la formé "Pénom-composé" juste le "composé" non ?
Edit : Je crois voir mon erreur dans l'interprétation de ce que tu as écrit. En fait le dernier mot du champ est une suite de caractères sans espaces. Donc Jean-Maximilien est identique à Jean ou à Maximilien.


pingouinux a écrit :

Vérifie aussi les noms de villes. Lorsque ce nom est composé de plusieurs mots, dans mon script en #12, je remplace les espaces par des "_", ce qui n'est paut-être pas très futé.

Oui j'avais vu, dans ton script j'avais remplacé "_" par  " " wink

Dernière modification par soupaloignon (Le 08/08/2014, à 22:13)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#20 Le 09/08/2014, à 07:09

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

À tester :

#!/usr/bin/python3

import sys, re

re_3lignes=re.compile(';+([^\n]+?);*\n;+([^\n]+?);+\n;+\n')

#  Première lettre de chaque mot en majuscule, les autres en minuscule
def capit(s) :
    ret=[]
    for k in s.split() : ret.append(k.capitalize())
    return ' '.join(ret)

# Mise en forme du numéro de téléphone
def tel(s) :
    ret='0'+s[0]
    for k in range(1,len(s),2) : ret+=" %s"%s[k:k+2]
    return ret

# Suppression des accents (liste à compléter éventuellement)
def no_accent(s) :
    for p,r in ( ('[àâ]',  'a')
               , ('[éèêë]','e')
               , ('[îï]',  'i')
               , ('[ôö]',  'o')
               , ('[ùûü]', 'u')
               ) :
        k=re.search(p,s)
        if k : s=re.sub(k.group(0),r,s)
    return s

with open(sys.argv[1],'r') as f : fic=f.read()
#print(fic);sys.exit()

while True :
   k=re_3lignes.search(fic)
   if(k) :
    # 3 lignes regroupées en 1 seule
      lig="AA %s;%s\n"%(k.group(1),k.group(2))
    # Extraction des champs
      intit,num,nom_prenom,adrs,tel1,tel2,code_ville=map(capit,lig.split(";"))
    # Traitement de nom et prénom (recherche de "rpt")
      npspl=nom_prenom.lower().split()
      try : rpt=npspl.index('rpt')
      except ValueError : rpt=-1
      nom,prenom="_".join(npspl[1:rpt]),npspl[-1]
    # Mise en forme des numéros de téléphone
      tel1,tel2=map(tel,(tel1,tel2))
      cvspl=code_ville.split()
      code,ville=cvspl[0]," ".join(cvspl[1:])
    # Suppression des accents dans l'adresse mail
      mail=no_accent("%s.%s@nom-de-domaine.fr"%(prenom,nom))
      sys.stdout.write("%s\n"%";".join((intit,num,nom_prenom,adrs,tel1,tel2,code,ville,adrs,code,ville,mail)))
      fic=fic[k.end(0):]
   else :
      break

Édité : Légère simplification du script + ajout de commentaires

Dernière modification par pingouinux (Le 09/08/2014, à 07:56)

Hors ligne

#21 Le 09/08/2014, à 08:20

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Hello,

Je viens de tester la 2ème version édité (j'avais déjà testé la 1ere). Cela marche nickel, les adresses mail tombent toutes justes, quelle que soit la composition du couple NOM Prénom. Géant big_smile
(j'ai juste remplacé l'underscore par un tiret ici :       nom,prenom="-".join(npspl[1:rpt]),npspl[-1]

Un dernier truc : Est il possible que le champ NOM Prénom passe de ça (infos natives)

M NOM COMPOSE RPT SARL ROTH 2000 Prénom
M NOM RPT SARL ROTH 2000 Prénom-composé

à ça :

M NOM COMPOSE Prénom
M NOM Prénom-composé


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#22 Le 09/08/2014, à 08:31

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

C'est possible, mais je verrai ça dans la journée, au plus tard demain. Tu auras ainsi le temps de suggérer d'autres modifs… hmm

Ajouté : Veux-tu dire qu'il ne faut pas modifier la casse des noms ?

Dernière modification par pingouinux (Le 09/08/2014, à 08:56)

Hors ligne

#23 Le 09/08/2014, à 11:16

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

J'ai ajouté une question à mon message précédent.

#!/usr/bin/python3

import sys, re

re_3lignes=re.compile(';+([^\n]+?);*\n;+([^\n]+?);+\n;+\n')

#  Première lettre de chaque mot en majuscule, les autres en minuscule
def capit(s) :
    ret=[]
    for k in s.split() : ret.append(k.capitalize())
    return ' '.join(ret)

# Mise en forme du numéro de téléphone
def tel(s) :
    ret='0'+s[0]
    for k in range(1,len(s),2) : ret+=" %s"%s[k:k+2]
    return ret

# Suppression des accents (liste à compléter éventuellement)
def no_accent(s) :
    for p,r in ( ('[àâ]',  'a')
               , ('[éèêë]','e')
               , ('[îï]',  'i')
               , ('[ôö]',  'o')
               , ('[ùûü]', 'u')
               ) :
        k=re.search(p,s)
        if k : s=re.sub(k.group(0),r,s)
    return s

with open(sys.argv[1],'r') as f : fic=f.read()
#print(fic);sys.exit()

while True :
   k=re_3lignes.search(fic)
   if(k) :
    # 3 lignes regroupées en 1 seule
      lig="AA %s;%s\n"%(k.group(1),k.group(2))
      ligspl=lig.split(";")
    # Extraction des champs et modification de la casse
      intit,num,adrs,tel1,tel2,code_ville=map(capit,ligspl[:2]+ligspl[3:])
      nom_prenom=ligspl[2]
    # Traitement de nom et prénom (recherche de "rpt")
      npspl=nom_prenom.split()          # Découpage en mots, casse initiale
      npspll=nom_prenom.lower().split() # Découpage en mots, tout en minuscule
      try : rpt=npspll.index('rpt')     # rpt = position du mot 'rpt' dans la liste
      except ValueError : rpt=-1
      nom_prenom=" ".join(npspl[:rpt]+[npspl[-1]])
      nom,prenom="-".join(npspll[1:rpt]),npspll[-1]
    # Mise en forme des numéros de téléphone
      tel1,tel2=map(tel,(tel1,tel2))
    # Traitement de code et ville
      cvspl=code_ville.split()
      code,ville=cvspl[0]," ".join(cvspl[1:])
    # Suppression des accents dans l'adresse mail
      mail=no_accent("%s.%s@nom-de-domaine.fr"%(prenom,nom))
      sys.stdout.write("%s\n"%";".join((intit,num,nom_prenom,adrs,tel1,tel2,code,ville,adrs,code,ville,mail)))
      fic=fic[k.end(0):]
   else :
      break

Hors ligne

#24 Le 09/08/2014, à 17:58

soupaloignon

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

Hello,

Pour la casse du Nom, c'est sans incidence, en l'état (script #20 et #23) la casse est en minuscule, c'est parfait.


Je n'ai pas noté de différence dans les résultats d'un fichier passé dans les scripts #20 et #23, tu as modifié quoi dans le #23 ?


Tu auras ainsi le temps de suggérer d'autres modifs… hmm

J'ai cherché un smilley rougissant/honteux, mais pas trouvé ...
Je suis désolé, j'ai du mal m'exprimer dans le post #17. Dans mon esprit je parlais du résultat final du champ "Nom Prénom"

Ce qui donnerait donc :
Infos natives du champs "Nom Prénom"

M NOM COMPOSE RPT SARL ROTH 2000 Prénom
M NOM RPT SARL ROTH 2000 Prénom-composé

Résultat dans le champs "Nom Prénom" (donc casse du nom en minuscule) :

M Nom Composé Prénom
M Nom Prénom-composé

Dernière modification par soupaloignon (Le 09/08/2014, à 18:03)


==> Libérez les huitres du bassin d'Arcachon <==

Hors ligne

#25 Le 09/08/2014, à 18:44

pingouinux

Re : [Résolu] Script à réaliser : Que pensez vous de la progression

soupaloignon #24 a écrit :

Je n'ai pas noté de différence dans les résultats d'un fichier passé dans les scripts #20 et #23, tu as modifié quoi dans le #23 ?

À partir de cette ligne

;;;C EST ICI;69991;MME DE LA HAUTE MACHERE RPT SARL XYZT 2000 Marie-Angélique;29 RUE DE LA GARE;122334455;233445566
;;;;;;68881 C EST LÀ;;
;;;;;;;;

voici ce qu'on obtient :

#20

Aa C Est Ici;69991;Mme De La Haute Machere Rpt Sarl Xyzt 2000 Marie-angélique;29 Rue De La Gare;01 22 33 44 55;02 33 44 55 66;68881;C Est Là;29 Rue De La Gare;68881;C Est Là;marie-angelique.de_la_haute_machere@nom-de-domaine.fr

#23

Aa C Est Ici;69991;MME DE LA HAUTE MACHERE Marie-Angélique;29 Rue De La Gare;01 22 33 44 55;02 33 44 55 66;68881;C Est Là;29 Rue De La Gare;68881;C Est Là;marie-angelique.de-la-haute-machere@nom-de-domaine.fr

#25

Aa C Est Ici;69991;Mme De La Haute Machere Marie-angélique;29 Rue De La Gare;01 22 33 44 55;02 33 44 55 66;68881;C Est Là;29 Rue De La Gare;68881;C Est Là;marie-angelique.de-la-haute-machere@nom-de-domaine.fr
#!/usr/bin/python3

import sys, re

re_3lignes=re.compile(';+([^\n]+?);*\n;+([^\n]+?);+\n;+\n')

#  Première lettre de chaque mot en majuscule, les autres en minuscule
def capit(s) :
    ret=[]
    for k in s.split() : ret.append(k.capitalize())
    return ' '.join(ret)

# Mise en forme du numéro de téléphone
def tel(s) :
    ret='0'+s[0]
    for k in range(1,len(s),2) : ret+=" %s"%s[k:k+2]
    return ret

# Suppression des accents (liste à compléter éventuellement)
def no_accent(s) :
    for p,r in ( ('[àâ]',  'a')
               , ('[éèêë]','e')
               , ('[îï]',  'i')
               , ('[ôö]',  'o')
               , ('[ùûü]', 'u')
               ) :
        k=re.search(p,s)
        if k : s=re.sub(k.group(0),r,s)
    return s

with open(sys.argv[1],'r') as f : fic=f.read()
#print(fic);sys.exit()

while True :
   k=re_3lignes.search(fic)
   if(k) :
    # 3 lignes regroupées en 1 seule
      lig="AA %s;%s\n"%(k.group(1),k.group(2))
    # Extraction des champs et modification de la casse
      intit,num,nom_prenom,adrs,tel1,tel2,code_ville=map(capit,lig.split(";"))
    # Traitement de nom et prénom (recherche de "rpt")
      npspl=nom_prenom.split()          # Découpage en mots, casse initiale
      npspll=nom_prenom.lower().split() # Découpage en mots, tout en minuscule
      try : rpt=npspll.index('rpt')     # rpt = position du mot 'rpt' dans la liste
      except ValueError : rpt=-1
      nom_prenom=" ".join(npspl[:rpt]+[npspl[-1]])
      nom,prenom="-".join(npspll[1:rpt]),npspll[-1]
    # Mise en forme des numéros de téléphone
      tel1,tel2=map(tel,(tel1,tel2))
    # Traitement de code et ville
      cvspl=code_ville.split()
      code,ville=cvspl[0]," ".join(cvspl[1:])
    # Suppression des accents dans l'adresse mail
      mail=no_accent("%s.%s@nom-de-domaine.fr"%(prenom,nom))
      sys.stdout.write("%s\n"%";".join((intit,num,nom_prenom,adrs,tel1,tel2,code,ville,adrs,code,ville,mail)))
      fic=fic[k.end(0):]
   else :
      break

Il reste un problème de majuscule dans le second mot d'un prénom composé.

Hors ligne