Comparer valeurs de 3 fichiers et en afficher le resultat

Comparer valeurs de 3 fichiers et en afficher le resultat - Shell/Batch - Programmation

Marsh Posté le 29-06-2009 à 19:03:28    

Bonjour à tous,
Voilà j'ai fait en PHP un script qui importe dans trois tables SQL le contenu de trois fichier assez volumineux (entre 1 et 30Mo).
Ces fichiers sont au format XML pour le premier, et texte pour les deux autrse.
 
Le but est de récupérer les infos nommées Corresp1 et Corresp2 du fichier XML ainsi que le statut (voir format du fichier xml ci-dessous). Correspondant sur 8 caractères seulement. (parfois il y en a 11 mais je ne veut que les 8 premiers)

Code :
  1. <XML>
  2. <INFO>
  3. <REC>
  4.   <Corresp1>AAAAAAAA</Corresp1>
  5.   <Corresp2>BBBBBBBB</Corresp2>
  6.   <Statut>enable</Statut>
  7.   <Balise4>xxx</Balise4>
  8. </REC>
  9. <REC>
  10.   <Corresp1>CCCCCCCC</Corresp1>
  11.   <Corresp2>BBBBBBBB</Corresp2>
  12.   <Statut>enable</Statut>
  13.   <Balise4>xxx</Balise4>
  14. </REC>
  15. <REC>
  16.   <Corresp1>DDDDDDDDC</Corresp1>
  17.   <Corresp2>BBBBBBBB</Corresp2>
  18.   <Statut>disable</Statut>
  19.   <Balise4>xxx</Balise4>
  20. </REC>
  21. ...
  22. </INFO>
  23. </XML>


Ne garder que les valeurs Corresp1 et Corresp2 unique et pour lesquelles le statut est a enable. Donc ici je ne devrais récupérer que AAAAAAAA, CCCCCCCC et BBBBBBBB (une seule fois BBBBBBBB) et pas DDDDDDDD car statut = disable.
A partir de ces informations, je réduit cette liste en ne gardant que les infos qui ne figurent pas dans le 2eme et le 3eme fichier texte.
 
2eme fichier Texte (formaté comme suit) :

Correspondant : AAAAAAAA
Department :  
Last Name :  
First Name :  
Correspondant : EEEEEEEE
Department :  
Last Name :  
First Name :
[...]


3eme fichier texte (simple liste) :

AAAAAAAA
FFFFFFFF
[...]


J'affiche ensuite mon résultat ou je l'exporte directement dans un 4eme fichier texte en liste.
 
Merci pour votre aide je n'y connais pas grand chose en Batch ...


Message édité par Odissine le 30-06-2009 à 15:36:03
Reply

Marsh Posté le 29-06-2009 à 19:03:28   

Reply

Marsh Posté le 30-06-2009 à 13:54:28    

Je suis pas sûr d'avoir compris, mais si c'est pour manipuler des bases avec SQL, pourquoi tu ne fais pas simplement une requête suppression du type  
DELETE * FROM Table1 WHERE champ1 NOT IN (SELECT Champ1 FROM TABLE2 UNION SELECT CHamp1 FROM TABLE3)  
ou quelque chose d'équivalent?

Reply

Marsh Posté le 30-06-2009 à 15:37:53    

J'ai édité mon poste pour une meilleure compréhension de mon problème ... et surtout pour le re-qualifier dans la section Shell/Batch ;)
 
En esperant que vous allez trouver une solution à mon problème :)

Reply

Marsh Posté le 30-06-2009 à 15:48:18    

pour le premier fichier, tu peux le faire avec un gros grep | sed:

 
Code :
  1. grep -B2 "<Statut>enable</Statut>" fichier.xml | grep Corresp | sed "s#.*<Corresp.>\(.*\)</Corresp.>.*#\1#" | sort | uniq
 

pour le reste j'ai pas compris ce que tu voulais.


Message édité par pataluc le 30-06-2009 à 15:48:49
Reply

Marsh Posté le 30-06-2009 à 16:05:22    

En clair, j'ai 3 fichiers...
Je dois extraire du premier la liste des infos contenu dans Corresp avec Statut enable (ca nous donne par ex 3700 resultats ...)
Ensuite je compare cette liste avec le 2e fichier en extrayant aussi les infos relatif à Correspondant (ca donne un total de pres de 12 000 correspondants par ex) et je n'affiche que les corresp qui ne figurent pas dans cette liste.
Je fais la meme chose avec le 3e fichier (qui contient que 42 correspondants).
 
Fichier 1 :
AAAAAAAA
BBBBBBBB
CCCCCCCC
DDDDDDDD
 
Fichier 2 :
AAAAAAAA
BBBBBBBB
EEEEEEEE
FFFFFFFF
GGGGGGGG
 
Fichier 3:
DDDDDDDD
GGGGGGGG
 
Résultat :
CCCCCCCC car il n'est ni dans le fichier 2 ni dans le fichier 3 ... (ce qui devrait donné un total de pres de 80 correspondants que je voudrais exporter dans un fichier 4.txt.

Reply

Marsh Posté le 30-06-2009 à 16:17:27    

Code :
  1. grep -B2 "<Statut>enable</Statut>" fichier1 | grep Corresp | sed "s#.*<Corresp.>\(.*\)</Corresp.>.*#\1#" | sort | uniq > out
  2. for l in `cat out` ; do grep -q $l fichier2 fichier3; if [ $? -ne 0 ] ; then echo $l; fi; done
 

ca doit pas être loin de ressembler à ce que tu as besoin.

 

par contre je garantie rien niveau perf


Message édité par pataluc le 30-06-2009 à 16:19:46
Reply

Marsh Posté le 30-06-2009 à 16:29:22    

Oups ... je dois pas etre dans le bon sujet ... car grep n'est pas une commande windows mais Unix ... :( ...  
En fait j'ai besoin de trouver un système (autre que PHP car temps d'exécution trop long) pour faire la requête ci-dessus ... je pensais le faire avec un .bat ... mais je vais m'orienter vers Java ou pire C... Mais bon la j'ai du boulot ;)

Reply

Marsh Posté le 30-06-2009 à 16:37:58    

et alors, les portages des commandes unix vers windows c'est pas pour les chiens!  :p  
 
moi j'utilise UnxUtils http://unxutils.sourceforge.net/ ;)
 
par contre faudra juste adapter la syntaxe du for qui n'es pas la même en dos et en unix, le reste devrait marcher comme sur des roulettes...


Message édité par pataluc le 30-06-2009 à 16:38:35
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed