Accueil » Python » Forums Python » Forum général Python » [Debutant] Cas d'école mais je ne m'en sorts pas...

 • [Debutant] Cas d'école mais je ne m'en sorts pas...

Document Actions
Réponses: 13   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

 • [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par ph_biohazard le 21/05/2008 23:33
Bonjour a tous,

Je ne suis pas un gourou de python, et non plus un king des ordinogrammes/organigrammes, et la je seche :(

Voila ma problematique :

J'ai un fichier en ascii delimite A (ma référence).

Un soft m'envoie regulierement chaque semaine un fichier en ascii delimité que nous nommerons fichier B, qui a la meme structure que le fichier A, sauf que certains contenus des lignes peuvent changées voire même decallées dans le même champ mais plus bas dans le tableau si on le convertie dans un tableau xls.

Je souhaite faire script qui me cree un fichier comparatif C, qui prendrait chacune des valeurs de A et de B et me ressortirait (donc dans C) uniquement toutes les nouveautes contenu dans le fichier B par rapport au fichier A.

1. Est-ce possible ?

2. Je suis preneur de toute proposition de script qui pourrait me mettre sur la voie

Je vous remercie tous pour votre aide precieuse

PS. moi et les traitements de donnees dans les fichiers, ce n'est pas mon copain )))) mais je persiste !!

Tres Cordialement
Marc

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par jice le 22/05/2008 14:11
Bonjour,

Pourquoi ne pas utiliser un programme de diff quelconque comme csdiff (pour windows - pour linux il y a diff tout court)
http://www.componentsoftware.com/products/CSDiff/index.htm

Sinon, s'il est nécessaire d'écrire un script pour ça, c'est que j'ai mal compris le texte et un petit éclaircissement du paragraphe "un...xls" serait le bienvenu.
Que veut dire "décalées dans le même champ mais plus bas dans le tableau si on le convertit dans un tableau xls"

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par jice le 22/05/2008 15:50
Et puis, quelles différences veux-tu voir listées ?
Serait-il possible de mettre un petit bout de fichier pour illustrer la structure ?

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par ph_biohazard le 30/05/2008 14:35
Bonjour Jice,

Merci pour ton aide, desole pour le delais, j'ai eu une coupure du net suite a un orage.

Bref, tout fonctionne maintenant.

Voici ci-dessous, les 2 fichiers exemples CSV. FichierA.CSV est le fichier du mois anterieur, le fichierB.csv est le fichier fin de mois en cours.

L'idee est de ne prendre que les nouvelles entrees et faire ressortir dans un print quelconque que les 2 derniers champs de chaque ligne des nouvelles entrees.

Voila voila mon pb !

Je te remercie encore pour ton aide

Tres Cordialement

FichierA.CSV :

code:

Activé,Utilisateur1,Moyenne,Serveur,Le poste n'était pas connecté au serveur,Utilisateur 1 expire le 29 juin 2008,Utilisateur1
Activé,VVA-XP,Très basse,Agent,OK,Poste Vva en dmz,Vva
Activé,XPSP2,Très basse,Agent,OK, trial version jusqu'au 29 mai 2008,JL
Activé,test2,Moyenne,Serveur,Le poste n'était pas connecté au serveur,test2 expire le 29 mai 2008,test2
Activé,test3,Moyenne,Serveur,Le poste n'était pas connecté au serveur,test3 expire le 14 mai 2008,test3
Activé,test4,Moyenne,Serveur,Le poste n'était pas connecté au serveur,test4 expire le 5/7/2008,test4



FichierB.CSV

code:

Activé,VVA-XP,Très basse,Agent,OK,Poste Vova en dmz,Vva
Activé,XPSP2,Moyenne,Serveur,Le poste n'est pas visible 2008/05/22 18:20:52.515, trial version jusqu'au 29 mai 2008,JL
Activé,,Très basse,Agent,OK,,
Activé,user1-test,Moyenne,Serveur,Le poste n'était pas connecté au serveur,expire le 19/8/08 user1-test,user1-test
Activé,user1-truc,Moyenne,Serveur,Le poste n'était pas connecté au serveur,expire le 26/7/08 User1-Truc,user1-truc
Activé,user2-truc,Moyenne,Serveur,Le poste n'était pas connecté au serveur,expire le 26/7/08 User2,user2-truc

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par glickind le 02/06/2008 01:51
euh, c'est bizarre, dans ton exemple, A.CSV et B.CSV n'ont aucune ligne en commun
donc tout le fichier B.CSV est nouveau

qq remarques,
il y a bien des lignes qui se ressemblent:
dans A.CSV: Activé,VVA-XP,Très basse,Agent,OK,Poste Vva en dmz,Vva
dans B.CSV: Activé,VVA-XP,Très basse,Agent,OK,Poste Vova en dmz,Vva
il y a un 'o' en plus

A.CSV: Activé,XPSP2,Très basse,Agent,OK, trial version jusqu'au 29 mai 2008,JL
B.CSV: Activé,,Très basse,Agent,OK,,
sont identiques si on ne tient pas compte des colonnes 2, 6 et 7.

Peux-tu préciser les règles pour comparer 2 lignes:
egalité stricte, à 1 lettre près, sans tenir compte de certaines colonnes ... ?

Par ailleurs A.CSV contient 2 formats de date "14 mai 2008" et "5/7/2008"
B.CSV contient 2 fois l'utilisateur en fin de ligne "user1-test,user1-test"

-------------------
Voila ce que je te propose:

J'ai viré le "o" de B.csv pour avoir une ligne commune avec A.csv:
Activé,VVA-XP,Très basse,Agent,OK,Poste Vva en dmz,Vva

sous une ligne de commande Unix, voici mon code
code:
comm -1 -3 A.csv B.csv  | awk -F, '{print $(NF-1) "," $NF}'

et j'obtiens:
code:
 trial version jusqu'au 29 mai 2008,JL
,
expire le 19/8/08 user1-test,user1-test
expire le 26/7/08 User1-Truc,user1-truc
expire le 26/7/08 User2,user2-truc


Si t'es encore sous Windows, tu peux installer Linux ;)
Si tu persistes sous Windows, va voir sur
http://unxutils.sourceforge.net/
ou sur http://gnuwin32.sourceforge.net/
comm est dans le package CoreUtils
tu peux utiliser gawk a la place de awk

désolé y a pas de python dans cette solution

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par jice le 02/06/2008 10:46
Une solution python n'est pas très compliquée à mettre en oeuvre...
Je la poste dès que j'ai un peu de temps...

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par ph_biohazard le 02/06/2008 11:39
Bonjour,

Desole, je te refais un copier/coller des 2 fichiers. Sauf que le fichierB, j'ai fait une reexportation aujourd'hui du soft de ma boite en ajoutant des utilisateurs.

Pour repondre a ta question seuls les 2 derniers champs m'interessent car les autres champs peuvent changer, et ne m'interessent pas.
L'avant-dernier champs est en fait un champ de description dans l'appli, donc la secretaire peut y mettre ce qu'elle veut.
Effectivement, il y a une ligne ou 2 champs sont vides, je ne comprends pas, peut etre il y a eu une faute de frappe, qui est ressorti dans l'extraction...ce n'est pas tres important si on la fait ressortir dans l'affichage final.

Par contre, la secretaire est sous windows, et je comptais lui faire un TKinter simple pour qu'elle fasse l'extraction facilement avec python compile.

Revoici le fichierA.CVS

code:

Activé,Utilisateur1,Moyenne,Serveur,Le poste n'était pas connecté au serveur,Utilisateur 1 expire le 29 juin 2008,Utilisateur1
Activé,VVA-XP,Très basse,Agent,OK,Poste Vva en dmz,Vova
Activé,XPSP2,Très basse,Agent,OK, trial version jusqu'au 29 mai 2008,JL
Activé,test2,Moyenne,Serveur,Le poste n'était pas connecté au serveur,test2 expire le 29 mai 2008,test2
Activé,test3,Moyenne,Serveur,Le poste n'était pas connecté au serveur,test3 expire le 14 mai 2008,test3
Activé,test4,Moyenne,Serveur,Le poste n'était pas connecté au serveur,test4 expire le 5/7/2008,test4



Voici le fichierB.csv que j'ai genere ce matin :

code:

Activé,VOVA-XP,Moyenne,Serveur,Le poste n'est pas visible 2008/05/25 22:46:04.890,Poste Vova en dmz,Vova
Activé,,Très basse,Agent,OK,,
Activé,XPSP2-AVDESK,Moyenne,Serveur,Le poste n'est pas visible 2008/05/22 18:20:52.515,JL trial version expiration 29 mai 2008,JL
Activé,,Très basse,Agent,OK,,
Activé,hop8,Moyenne,Serveur,Le poste n'était pas connecté au serveur,utilisateur hop8 expire le 28 aout 2008,hop8
Activé,machin1,Moyenne,Serveur,Le poste n'était pas connecté au serveur,utilisateur machin1 expiration au 21/8/2008,machin1
Activé,user1-test,Moyenne,Serveur,Le poste n'était pas connecté au serveur,expire le 19/8/08 user1-test,user1-test
Activé,user1-truc,Moyenne,Serveur,Le poste n'était pas connecté au serveur,expire le 26/7/08 User1-Truc,user1-truc
Activé,user2-truc,Moyenne,Serveur,Le poste n'était pas connecté au serveur,expire le 26/7/08 User2,user2-truc



Merci pour votre aide

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par jice le 02/06/2008 14:07
Bon, voici un script qui devrait faire ce que tu veux (à adapter si besoin).
Je n'ai pas pu le tester car je n'ai pas le temps, mais il ne devrait pas y avoir trop de problème. S'il y en a, n'hésite pas à te plaindre ici même :)

Le principe est d'ouvrir le fichier A et de stocker les parties de lignes discriminantes comme clés d'un dictionnaire.
Ensuite, on compare les mêmes parties de lignes du fichier B avec ces clés et on les écrit si elles sont en double...

code:
import string

def creeCle(liste):
    """ crée la clé à partir des éléments de la ligne
    """
    cle=liste[-2] + liste[-1] # On concatène les deux derniers éléments de la ligne comme clé
                              # Cela correspond à ce que tu considères comme à vérifier
                              # Eventuellement, cela peut être la ligne entière
    return cle

dF1={}  # Dictionnaire des éléments que nous aurons dans le premier ficher
        # Les clés du dictionnaire seront les éléments qui nous permettrons
        # de décider si une ligne est en double ou non
for line in file("fichierA"):       # On parcourt les lignes du fichier A
    sLine=string.split(line, ',')   # éclate la ligne selon les ",". sLine est une liste
    cle=creeCle(sLine)
    dF1[cle] = None                  # uniquement pour vérifier l'existence.
          # La valeur est sans importance (sauf si tu veux écrire la ligne du fichier A)

f2=open("fichierDeSortie.txt",'w')
# On parcourt les lignes du fichier B
for line in file('fichierB'):
    sLine=string.split(line, ',')   # éclate la ligne selon les ",".
                                    # sLine est une liste
    cle=creeCle(sLine)
    if dF1.has_key(cle):            # Si la clé est présente dans dF1,
                                    # la ligne est en double
        f2.write(string.join([-2], sLine[-1]], ',') # On écrit les éléments voulus

f2.close()

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par ph_biohazard le 02/06/2008 18:46
Merci Jice,

J'ai essaye ton script, mais j'ai une erreur sur f2.close()

J'ai corrige sur la ligne suivante le sLine[-1]] car il y avait un crochet de trop, mais j'ai tjrs une erreur sur le f2.close()... pourquoi a ton avis?

Merci pour ton aide :)

wink Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par multani le 03/06/2008 19:21
Jice > l'utilisation du module string n'est pas très utile, vu que les fonctions que tu utilises sont des méthodes des objets de type string. D'ailleurs, ces fonctions de ce module sont dépréciées .

Donc, au lieu d'avoir :
code:
sLine = string.split(line, ',')
string.join([-2], sLine[-1], ',')

on aura plutôt :
code:
sLine = line.split(',')
','.join(sLine) # == line (en fait)



Également, au lieu d'utiliser un dictionnaire pour vérifier la présence d'une valeur, c'est mieux d'utiliser un set pour faire ça.

Sinon, l'avant dernière ligne est incorrecte (il manque une parenthèse, il y a un crochet en trop, et un paramètre en trop aussi à string.join je pense).

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par jice le 04/06/2008 08:38
En fait, c'est parce que, dans ce forum, il faut mettre des espaces après les "[" si on ne veut pas les voir interprété comme des tags. Du coup, mon "[sLine[" a disparu... Désolé...
code:
f2.write(string.join([sLine[-2], sLine[-1]], ',')


@multani : merci pour tes remarques...

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par jice le 04/06/2008 08:40
En fait, c'est parce que, dans ce forum, il faut mettre des espaces après les "[" si on ne veut pas les voir interprété comme des tags. Du coup, mon "[sLine[" a disparu... Désolé...
code:
f2.write(string.join([sLine[-2], sLine[-1]], ',')


@multani : merci pour tes remarques...

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par ph_biohazard le 12/06/2008 22:34
Bonjour a tous,

Je vous remercie pour vos aides et commentaires, cependant avec ou sans ]]" ou sans, j'ai le meme probleme.
J'ai bien compris que le mieux etait d'utiliser le split, et voici le code :
code:
import string 

def creeCle(liste): 

    cle=liste[-2] + liste[-1]
    return cle 

dF1={}  
for line in file("c:/newc.csv"):    
    sLine = line.split(',')  
    cle=creeCle(sLine) 
    dF1= None

f2=open("c:/fichier_out.txt",'wb')

for line in file('c:/newd.csv'):
sLine = line.split(',')
cle=creeCle(sLine)
if dF1.has_key(cle):
#f2.write(string.join(sLine))
f2.write(string.join([-2], sLine[-1]], ',')
f2.close()



Si je laisse l'avant derniere ligne telle quelle, j'ai l'erreur de syntaxe sur le f2.close, par contre, si le commente, et je decommente la ligne f2.write de dessus, j'ai un bon debut sur le fichier de sortie, mais je n'arrive pas a extraire les deux ou trois dernieres cellules de fin de ligne.

Comment puis-je m'en sortir?

Merci pour vos recommendations

 • Re: [Debutant] Cas d'école mais je ne m'en sorts pas...

Posté par jice le 13/06/2008 14:15
Pas
code:
f2.write(string.join([-2], sLine[-1]], ',')

mais
code:
f2.write(string.join([sLine[-2], sLine[-1]], ',')

Dans mon premier script,[sLine disparaissait parce qu'il était interprété comme un tag (pour éviter le problème, il faut mettre un espace après le[.