2013-08-30 1 views
1

J'ai un fichier diff et je veux gérer les ajouts/suppressions/modifications pour mettre à jour une base de données SQL.Traiter les modifications dans un fichier diff

+NameA|InfoA1|InfoA2 
-NameB|InfoB1|InfoB2 
+NameB|InfoB3|InfoB2 
-NameC|InfoC1|InfoC2 
-NameD|InfoD1|InfoD2 
-NameE|InfoE1|InfoE2 
+NameD|InfoD1|InfoD3 
+NameE|InfoE3|InfoE2 

Avec un script Python, j'ai détecte deux lignes suivantes avec une des expressions régulières pour traiter des modifications comme B.

re.compile(r"^-(.+?)\|(.*?)\|(.+?)\n\+(.+?)\|(.*?)\|(.+?)(?:\n|\Z)", re.MULTILINE) 

supprimer toutes les lignes de correspondance, puis analyser à nouveau mon dossier et manipule tous comme des ajouts/suppressions. Mon problème est avec des lignes comme D & E. Pour l'instant je les traite comme deux suppressions, puis deux ajouts, et j'ai des conséquences de CASCADE DELETE dans ma base de données SQL, comme je devrais les traiter comme des modifications.

Comment puis-je gérer de telles modifications D & E?

Le fichier diff est généré par un script bash avant, je pourrais le gérer différemment si nécessaire.

+1

Ce n'est pas une bonne application de regexp. Parcourez simplement les lignes, en enregistrant les suppressions et les ajouts dans les dictionnaires. Si une clé se trouve dans les deux dictionnaires, c'est une modification. – Barmar

Répondre

1

Essayez ceci:

>>> a = ''' 
+NameA|InfoA1|InfoA2 
-NameB|InfoB1|InfoB2 
+NameB|InfoB3|InfoB2 
-NameC|InfoC1|InfoC2 
-NameD|InfoD1|InfoD2 
-NameE|InfoE1|InfoE2 
+NameD|InfoD1|InfoD3 
+NameE|InfoE3|InfoE2 
''' 
>>> diff = {} 
>>> for row in a.splitlines(): 
    if not row: 
     continue 
    s = row.split('|') 
    name = s[0][1:] 
    data = s[1:] 
    if row.startswith('+'): 
     change = diff.get(name, {'rows': []}) 
     change['rows'].append(row) 
     change['status'] = 'modified' if change.has_key('status') else 'added' 
    else: 
     change = diff.get(name, {'rows': []}) 
     change['rows'].append(row) 
     change['status'] = 'modified' if change.has_key('status') else 'removed' 
    diff[name] = change 

>>> def print_by_status(status=None): 
for item, value in diff.items(): 
    if status is not None and status == value['status'] or status is None: 
     print '\nStatus: %s\n%s' % (value['status'], '\n'.join(value['rows'])) 
>>> print_by_status(status='added') 

Status: added 
+NameA|InfoA1|InfoA2 
>>> print_by_status(status='modified') 

Status: modified 
-NameD|InfoD1|InfoD2 
+NameD|InfoD1|InfoD3 

Status: modified 
-NameE|InfoE1|InfoE2 
+NameE|InfoE3|InfoE2 

Status: modified, 
-NameB|InfoB1|InfoB2 
+NameB|InfoB3|InfoB2 

Dans ce cas, vous aurez le dictionnaire avec toutes les données recueillies avec le statut de diff et de lignes. Vous pouvez faire avec dict courant tout ce que vous voulez.

Questions connexes