处理diff文件中的修改

时间:2013-08-30 10:08:28

标签: python regex diff

我有一个diff文件,我想处理添加/删除/修改以更新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& D这样的线路。 E.目前我将它们视为两个删除,然后是两个添加,我在SQL数据库中得到了CASCADE DELETE的结果,因为我应该将它们视为修改。

如何处理此类修改D& E'

差异文件之前是由bash脚本生成的,如果需要,我可以用不同的方式处理它。

1 个答案:

答案 0 :(得分: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

在这种情况下,您将拥有包含差异状态和行的所有收集数据的字典。无论你想要什么,你都可以使用当前的dict。