Aide script concaténation intelligente sur deux fichiers - Python - Programmation
Marsh Posté le 12-08-2009 à 14:54:32
tu ne crois pas que tu aurais intérêt à mettre tout ca en bdd, dans deux tables, et ensuite à récupérer le résultat via une requête? ca te permettrait de bénéficier de la puissance d'un sgbd...
Marsh Posté le 12-08-2009 à 16:46:11
Le souci est que j'ai plus de 400 000 lignes a entrer eventuellement dans la table. Ce qui fait environ 40 mo et que je ne peux integrer à la fois que 2mo.
Alors le souci est que je risque de passer plus d'heure à decouper puis integrer mon fichier, tout en sachant que le traitement se ferait tous les mois que d'avoir un script qui reprendrait tout à zero.
Amicalement
Lonewolf
Marsh Posté le 12-08-2009 à 17:12:07
ok effectivement si c'est un traitement mensuel... mais je vois pas pourquoi tu pourrais pas charger 40mo en bdd... j'ai testé, en copiant tes 6 lignes d'exemples et en les dupliquant pour arriver à 800000 lignes (ce qui me fais un fichier de 50mo), mysql met 3 seconde seulement à les charger dans une table avec la requete suivante:
Code :
|
alors je pense qu'il ya moyen... pas sur qu'avec python tu puisse faire aussi bien...
après dsl, mais en python je peux pas t'aider...
Marsh Posté le 13-08-2009 à 19:32:15
On te retrouve de partout avec ta jointure... Steph70 !!!
Tu définis un dictionnaire
Code :
|
Tu traites le fichier 1.
Pour chaque ligne du fichier 1, tu extraits ce qui te servira de référence
Code :
|
Si ref n'est pas dans dict.keys(), ça veut dire que la ligne est nouvelle (pour le dictionnaire). Dans ce cas, tu la positionnes
Code :
|
Si ref est dans dict.keys(), ça veut dire que cette référence a déjà été insérée (théoriquement ça ne devrait jamais arriver mais bon...). Dans ce cas, à toi de gérer le cas...
Code :
|
Fin fichier 1
Code :
|
Tu traites le fichier 2
Pour chaque ligne du fichier 2, tu extraits ce qui te servira de référence
Code :
|
Si ref est dans dict.keys(), ça veut dire que cette référence a déjà été insérée à partir du fichier 1. Dans ce cas, tu la modifies
Code :
|
Si ref n'est pas dans dict.keys(), ça veut dire que la ligne du fichier 2 n'a pas de correspondance dans le fichier 1
Fin fichier 2
Code :
|
En final, te suffit d'afficher dict.values()
Code :
|
Maintenant, avec 40Mo de data, peut-être que ça peut quand-même être trop. Dans ce cas, voir soluce pataluc. En plus, Python intègre en interne la bdd SQLite => http://www.jacquet80.eu/blog/post/ [...] 241-sqlite...
Marsh Posté le 22-08-2009 à 10:54:49
Taz a écrit : c'est peanuts 40meg |
Pas si tu bosses avec un Pentium 75 et 64Mo de RAM
Marsh Posté le 12-08-2009 à 14:32:08
Bonjour à tous,
je fais appel à vous car je n'arrive pas a avoir un script correct qui me permette la concaténation de deux fichiers sur deux champs en 1 temps correct.
J'ai 2 fichiers, l'un de 440 000 lignes et l'autre de 10 000 lignes.
Les lignes ne se correspondent pas d'un fichier à l'autre. Une des lignes peut se retrouver en face de n'importe quelle autre du second fichier du moment ou le code_art et la campagne correspondent.
Il y aura plusieurs correspondance car si les code_art sont uniques, il y a plusieurs campagnes.
je sais que c'est un peu compliqué alors je vais vous redonner un exemple.
Premier fichier ex :
ou le premier champs correspond à un code magasin (il y en a environ 80), le deuxième champs correspond au code article et le troisième champs qui indique la campagne.
Le deuxième fichier ex :
La les deux premiers champs sont les champs de jointure avec le premier fichier. Il faut savoir que les lignes ne sont pas en face de l'autre fichier en cas de paste. Il faut bien chercher sur les champs de jointure pour les assembler dans un troisième fichier et donc aussi éliminer les champs qui deviennent doublon comme le code_art et la campagne.
Et voici la maquette finale ex :
J'ai bien réussi a faire cela en bash mais il me faut plus 48 heures pour réaliser le fichier final et c'est malheureusement impossible comme laps de temps.
J'espère que python pourra faire mieux que cela et que vous voudrez bien m'aider.
Merci d'avance
Lonewolf
ps : pour info, j'ai fais comme cela en bash
# 1: Transformer code_art;campagne en code_art@camapagne, et trier le fichier numeriquement sur le champ 2
# 1: Transformer code_art;campagne en code_art@camapagne, et trier le fichier numeriquement sur le champ 1
#3: Joindre les fichiers sur les champ 2 du fichier 1 et 1 du fichier2, remettre le champ mag à la bonne place, et separer le champ code_art@campagne en deux champ distincts