lundi 23 novembre 2009

Python - Cas pratique

Voici un cas pratique (et professionnel) d'utilisation de Python.
Grâce à Python il a été possible de faire une vérification croisée en utilisant seulement quelques lignes de code.
Voici donc un exemple vivant d'utilisation de techniques de lecture de fichier, d'itérateur et de compréhension list.

Description
Le but étant de comparer le contenu:
  1. D'une feuille Excel contenant des noms de tables pour lesquelles il faut implémenter un audit à l'aide de triggers.
    Deux des colonnes de ce document étant un copier-coller dans un fichier texte.
  2. La liste des tables sur lesquelles le consultant a déjà installé les triggers d'audit. Le nom de ces triggers étant formalisé, une simple requête sur sysobjects permet d'obtenir cette liste (également copier/coller dans un fichier texte).
Les deux fichiers précédemment décrits sont disponibles ici.

Le but

  1. Le consultant a t'il modifié toutes les tables comme attendu?
    Vérifier que les noms de table présent dans le feuille Excel (point 1) soient équipés de trigger comme attendu (et donc répertoriés dans le liste des tables du point 2). 
  2. Le consultant a t'il fait de l'excès de zèle?
    Vérifier qu'il n'y a pas de table (point 2) ayant inopinément reçu des triggers d'audit.
    Donc une entrée de la liste des tables (point 2) non présente dans la liste Excel (point 1).
     
Le code

>>> def readfile( sName ):
 _file = open( sName, 'r' )
 _content = _file.readlines()
 _file.close()
 return _content


>>> import re # Regular expression
>>> #--- Process Table List ---
>>> tablelist = readfile( 'c:/temp/tablelist.txt' )
>>> # Remove the \n at each end of line
>>> tablelist = [ re.sub(r'\n','', item) for item in tablelist ]
>>> #--- Process Excel List ---
>>> excellist = readfile( 'c:/temp/excellist.txt' )
>>> # content of excellist is
>>> #    ['tblTMProject\tok\n', 'tblCMPerson\tok\n',
>>> # extract the tablename before the tab
>>> #    only if tab+"ok" can be located within the string
>>> excellist = [ re.split(r'\t', item)[0] for item in excellist if re.search(r'\tok', item)>0 ]
>>> excellist = [ item.strip() for item in excellist ] # remove spaces

>>> #--- Find the missing table in Excellist ---
>>> #  find table name from tablelist not listed in the excel list 
>>> [ item for item in tablelist if not any( item.lower()==excelitem.lower() for excelitem in excellist ) ]
['xxxOrganization', 'xxxXmlImportSession', 'xxxComboType']

>>> #--- Find the missing table in tablelist ---
>>> #  find table name from excellist not listed in the table list
>>> [ item for item in excellist if not any( [ item.lower()==tableitem.lower() for tableitem in tablelist ] )]
[]

Information complémentaire:

Aucun commentaire: