Problème traitement de csv croisé

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Pour mon travail j'ai écrit un script pour croiser les données de deux CSV (en gros un presta nous donne des stats de consultation de document avec un ID par client et je dois matcher ces stats avec les VRAIS ID client.

Je souhaite ensuite inscrire dans un csv le resultat (une ligne par client avec le nombre de pages lues)

J'ai donc le code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import csv
import os

print("Bienvenue")

compte=csv.reader(open("compte.csv","r"),delimiter=";")
consommation=csv.reader(open("presta.csv","r"),delimiter=";")
result_name="stats.csv"
result=open(result_name,"w", newline='')
writer=csv.writer(result)
id=0
nom=""
consult=0


writer.writerow(("Client","Pages lues"))

for row in compte:
    id=row[0]
    nom=row[2]
    for row in consommation:
        if row[6]==id:
            consult+=int(row[4])
    writer.writerow((nom,consult))
    consult=0

print("Calcul terminé !")
os.system("pause")

Le premier csv est de la forme (celui du presta):

1
2
date;nom revue;osef;osef;pagesvues:osef;ID-presta;osef
date;nom revue;197;;1;;123456;R

Celui interne est de la forme :

1
2
num-presta;vrai ID client;nom client;....
123456;XBA7951;PONEY LUBRIQUE;....

(les … étant pour les autres colonnes qui ne servent à rien dans l'histoire)

Le script tourne bien sans erreur et inscrit dans le csv les resultats cependant seul le premier résultat remonte les pages vues tous les autres clients sont tous à 0 (il y a + de 10000 lignes dans le vrai fichier)

Une idée de pourquoi ?

Merci :)

+0 -0

Bonsoir,

J'ai pas trop regardé le script, car l'information que j'attendais en lisant c'était la forme de ton fichier csv. Tu as le nom des colonnes (nom revue, num-presta, …) et je te propose de travailler avec ces noms en utilisant la classe DictReader… Elle t'évitera en particulier les problèmes de lisibilité du code dû à des nombres magiques.

Quelques remarques,

  • Utilises with open plutôt que open
  • Utiliser input("pause") plutôt que os.system("pause")
+1 -0
Staff

Si c'est pour croiser des infos tu ferais mieux de mettre tes utilisateurs dans une petite base de données (genre sqlite) plutôt qu'un CSV. C'est fait pour ça.

I was a llama before it was cool

+1 -0
Staff

C'est un script qui est appelé souvent ? La base d'utilisateurs bouge beaucoup ? Y'a beaucoup d'entrées ?

Remplir ou mettre à jour une base sqlite automatiquement à partir d'un csv c'est pas très difficile ni spécialement coûteux. Suivant la facon dont ton script doit être exécuté, ça peut être rentable.

I was a llama before it was cool

+0 -0
Auteur du sujet

Je dois faire tourner le script une fois tous les mois sur deux fichiers avec environ 30 000 entrées cumulées .

Pour le moment un script PHP fait le taff dans un BDD sur mon ordi (pas dev par moi) mais je voulais en faire un .exe à fournir aux gens qui ont besoin de ces stats pour ne plus m'en occuper :)

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

Bon, restons sur le csv pour commencer.

Le problème c'est qu'à aucun moment tu ne charges ta base. Voilà comment tu pourrais t'y prendre avec le csv suivant :

1
2
3
num_presta;ID_client;nom_client
123456;XX01;PLOP
234567;XX02;PLIP

L'idée est d'associer le numéro de prestataire à l'ID client :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> import csv
>>> id_clients = {}
>>> with open('base_clients.csv') as base_clients:
...     fieldnames = base_clients.readline().strip().split(';')
...     for line in csv.DictReader(base_clients, fieldnames=fieldnames,
...                                delimiter=';'):
...         id_clients[line['num_presta']] = line['ID_client']
... 
>>> id_clients
{'234567': 'XX02', '123456': 'XX01'}

Comme tu le vois, en utilisant un DictReader le traitement est beaucoup plus simple. Dans cet exemple je présuppose que les noms des colonnes sont donnés au début du fichier dans la première ligne : adapte en fonction de ton cas.

Tu n'as plus qu'à ouvrir ton second CSV et le parcourir en allant chercher les correspondances dans le dictionnaire id_clients. Si 30000 entrées c'est trop pour toi niveau RAM, il faudra que tu passes par une base sqlite intermédiaire, mais chaque chose en son temps.

Édité par nohar

I was a llama before it was cool

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

En fait suivant la nature des données et la façon dont elles se recoupent, t'aurais moyen de faire des trucs beaucoup plus fouillés que ça niveau analyse. Genre tirer des graphes d'évolution dans le temps de la consultation des revues par un client donné, avec une courbe différente par revue…

C'est un truc parfait pour la lib pandas, ou à défaut tu peux sortir plusieurs CSV importables dans excel.

Après bien sûr ça dépend de la valeur que ta boîte attribue à ce genre d'infos mais vue la tendance des entreprises se tourner vers des pratiques data-driven, ça peut être une bonne occase pour toi de marquer des points. :)

Édité par nohar

I was a llama before it was cool

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte