簡體   English   中英

處理差異文件中的修改

[英]Handle modifications in a diff file

我有一個差異文件,我想處理添加/刪除/修改以更新SQL數據庫。

+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腳本生成的,如果需要,我可以用不同的方式處理它。

嘗試這個:

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

在這種情況下,您將擁有包含所有具有差異狀態和行的數據的字典。 您可以使用current dict進行任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM