2013-08-30 42 views
1

我有一個diff文件,我想處理添加/刪除/修改以更新SQL數據庫。在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 

有了Python腳本,我第一次發現了正則表達式以下兩行來處理類似的修改B.

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

我刪除所有匹配的行,然後重新掃描我的文件,然後再處理所有這些都像增加/刪除。 我的問題是像D & E這樣的行。目前我把它們當作兩個刪除,然後兩個添加,並且在我的SQL數據庫中有CASCADE DELETE的後果,因爲我應該將它們視爲修改。

如何處理此類修改D & E?

diff文件是由一個bash腳本生成的,如果需要,我可以以不同的方式處理它。

+1

這不是一個好的正則表達式的應用。只需遍歷行,記錄字典中的刪除和添加。如果一個密鑰在兩個字典中,這是一個修改。 – Barmar

回答

1

試試這個:

>>> 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 

在這種情況下,你將不得不與DIFF狀態和行所有收集到的數據字典。無論你想要什麼,你都可以使用當前字典。

相關問題