0
votes

Comparer le contenu de deux fichiers CSV, où la relation entre les deux fichiers est spécifiée dans un troisième fichier?

J'ai deux fichiers avec des données de vente et je souhaite valider si les numéros de vente dans le premier fichier sont les mêmes que les numéros de vente dans le deuxième fichier. Mais l'ID de produit utilisé dans chaque fichier est différent. J'ai un 3ème fichier avec la correspondance entre l'ancien identifiant de produit et le nouvel identifiant de produit.

fichier de vente ancien p> xxx pré>

nouveau fichier de vente p> xxx pré>

et un ancien produit d'identifiant de produit / nouveau produit de correspondance : P>

Product ID   Store ID   Week ID  Sales Diff
 X               1       201801      0
 X               2       201801      0
 X               2       201802      0 
 Y               1       201801      2
 Y               2       201802      0
 Y               3       201801      0  
 Z               2       201802      0


4 commentaires

Je ne pense pas que le traitement des tables de données relationnelles telles que des données relationnelles soit surchargée. J'utiliserais SQLite pour cela, mais la même idée.


Votre Pandas L'approche semble raisonnable pour moi.


I Deuxième Quang, Pandas peut facilement gérer cela en fonction de la taille du fichier. Bien que SQL serait probablement mieux avec une procédure stockée de quelque sorte. Quelle est la taille de vos fichiers?


@Quanghoang environ 600m pour chaque fichier de vente. Le fichier de correspondance est un peu plus petit.


3 Réponses :


2
votes

Voici une suggestion pour votre Pandas approche. J'ai appelé votre ancien Dataframe Old et votre nouveau Dataframe Nouveau :

Nous utilisons votre troisième Dataframe comme dictionnaire pour carte L'ancien ID de produit aux nouveaux: xxx

alors nous faisons un Fusionner gauche sur les colonnes que vous souhaitez vérifier les modifications apportées. Remarque Une fusion de gauche vous donnera tous les matchs et les différences montreront dans nan . Dans ce cas, nous n'en avons pas: xxx

si nous laissons vente en tant que clé , nous pouvons Comparez plus facilement en raison du Suffixes argument: xxx


0 commentaires

0
votes
$ cat tst.awk
BEGIN { OFS="\t" }
ARGIND==1 { map[$2] = $1; next }
ARGIND==2 { old[$1,$2,$3] = $4; next }
FNR==1 { gsub(/  +/,OFS); sub(/ *$/,"_Diff"); print; next }
{ print $1, $2, $3, $4 - old[map[$1],$2,$3] }

$ awk -f tst.awk map old new | column -s$'\t' -t
Product ID  Store ID  Week ID  Sales_Diff
X           1         201801   0
X           2         201801   0
X           2         201802   0
Y           1         201801   2
Y           2         201802   0
Y           3         201801   0
Z           2         201802   0
The above uses GNU awk for ARGIND. With other awks just add the line FNR==1 { ARGIND++ } just after the BEGIN line.

0 commentaires

3
votes

Je suis un fan de l'approche "Faites-le dans SQL", spécifiquement, SQLite:

$ ./report.sh old_sales.tsv new_sales.tsv product_mappings.tsv
Product ID  Store ID    Week ID Sales Diff
X   1   201801  0
X   2   201801  0
X   2   201802  0
Y   1   201801  2
Y   2   201802  0
Y   3   201801  0
Z   2   201802  0


0 commentaires