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 30/06/2024, à 10:59

jojo260

[Résolu] Attribuer un numéro à un nom fichier Csv

Bonjour

J'ai un fichier Csv  dans le quel j'ai les champs Nom , prénom, date de naissance,... et j'aimerai attribuer à chaque personne 1 numéro

 Numero|Sexe|Nom|Prenom|Date de Naissance| ...|
1|M|Dupont|Paul|01.01.2000| |
2|M|Dupont|Paul|01.01.2000| |
3|M|Durant|Paul|01.01.2000| |
4|M|Durant|Pierre|01.01.2000| |
5|M|Durant|Pierre|01.01.2000| |
6|F|Durant|Charlotte|01.01.2000| |
7|F|Durant|Charlotte|01.01.2000| |
...
.

Voila ce que j'aimerai obtenir

 
 Numero|Sexe|Nom|Prenom|Date de Naissance| ...|
1|M|Dupont|Paul|01.01.2000| |
1|M|Dupont|Paul|01.01.2000| |
1|M|Durant|Paul|01.01.2000| |
2|M|Durant|Pierre|01.01.2000| |
2|M|Durant|Pierre|01.01.2000| |
3|F|Durant|Charlotte|01.01.2000| |
3|F|Durant|Charlotte|01.01.2000| |
...
.

Merci pour l'aide que vous pourriez m'apporter. smile

Dernière modification par jojo260 (Le 01/07/2024, à 11:38)

Hors ligne

#2 Le 30/06/2024, à 16:28

pingouinux

Re : [Résolu] Attribuer un numéro à un nom fichier Csv

Bonjour,
Tu peux essayer ce script python :

$ cat script.py
#!/usr/bin/env python3
import sys

fic_i=sys.argv[1]
with open(fic_i) as f: ligs=f.readlines()

liste_identites=[];numero_ordre={};ligne_corrigee=[]
k=0; num_nom=0
for lig in ligs:
   k+=1; lig=lig[:-1]
   if k==1: print(lig); continue
   lig_spl=tuple(lig.split('|'))
   num,nom,suite=lig_spl[0],lig_spl[1:5],lig_spl[5:]
   if nom not in liste_identites: num_nom+=1; numero_ordre[nom]=num_nom
   liste_identites.append(nom); ligne_corrigee.append((str(numero_ordre[nom]),)+nom+suite)

k=0
for nom in liste_identites:
   print('|'.join(ligne_corrigee[k]))
   k+=1

À utiliser ainsi :

./script.py fichier.csv

Hors ligne

#3 Le 30/06/2024, à 19:36

jojo260

Re : [Résolu] Attribuer un numéro à un nom fichier Csv

Merci pour le script il fonctionne parfaitement, mais j'aimerai comprend ce que signifie le script, car je suis novice (python je ne connais pas) et si je suis amené à changer l'ordre des champs j'aimerai pouvoir l'adapter.

Hors ligne

#4 Le 30/06/2024, à 23:49

kamaris

Re : [Résolu] Attribuer un numéro à un nom fichier Csv

Je suppose qu'il y a une erreur à la ligne

3|M|Durant|Paul|01.01.2000| |

qui devrait être

3|M|Dupont|Paul|01.01.2000| |

?

Sur cette base, voici une solution awk avec un tri préalable au cas où :

sort -k1n -t'|' fichier | awk 'BEGIN { OFS = FS = "|" } NR == 1 { print } NR > 1 { if (!a[$3$4]) a[$3$4] = ++n; $1 = a[$3$4]; print }'

Hors ligne

#5 Le 01/07/2024, à 11:37

jojo260

Re : [Résolu] Attribuer un numéro à un nom fichier Csv

Excellent Kamaris. Merci smile

Hors ligne

#6 Le 01/07/2024, à 14:43

pingouinux

Re : [Résolu] Attribuer un numéro à un nom fichier Csv

Voici le script avec quelques commentaires.

#!/usr/bin/env python3
import sys

fic_i=sys.argv[1] # Fichier d'entrée
with open(fic_i) as f: ligs=f.readlines() # Lecture des lignes du fichier d'entrée

liste_identites=[]    # Liste des identités différentes (Sexe,Nom,Prénom,Date de Naissance)
numero_ordre={}       # Dictionnaire contenant l'ordre d'apparition des identités
ligne_corrigee=[]     # Liste des lignes après correction du 1er champ

k=0; num_nom=0
for lig in ligs:
   k+=1; lig=lig[:-1] # Suppression du dernier caractère de la ligne '\n'
   if k==1: print(lig); continue # On ne traite pas la première ligne (liste des champs)
   lig_spl=tuple(lig.split('|')) # Découpage de la ligne en champs
   num,nom,suite=lig_spl[0],lig_spl[1:5],lig_spl[5:]
 # num : champ 1, numéroté 0 -> cette valeur sera ignorée
 # nom : champs 2 à 5, numérotés 1 à 4 -> Nom de l'identité (Sexe,Nom,Prénom,Date de Naissance)
 # suite : Le reste de la ligne
   if nom not in liste_identites: num_nom+=1; numero_ordre[nom]=num_nom
   liste_identites.append(nom); ligne_corrigee.append((str(numero_ordre[nom]),)+nom+suite)

k=0
for nom in liste_identites:
   print('|'.join(ligne_corrigee[k])) # Ajout des séparateurs de champs
   k+=1

Hors ligne

#7 Le 01/07/2024, à 16:39

Watael

Re : [Résolu] Attribuer un numéro à un nom fichier Csv

Gawk devrait permettre de se dispenser de sort.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne