#1 Le 30/06/2024, à 09: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.
Dernière modification par jojo260 (Le 01/07/2024, à 10:38)
Hors ligne
#2 Le 30/06/2024, à 15: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, à 18: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, à 22: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, à 10:37
- jojo260
Re : [Résolu] Attribuer un numéro à un nom fichier Csv
Excellent Kamaris. Merci
Hors ligne
#6 Le 01/07/2024, à 13: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, à 15: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