1

我有一个差异文件,我想处理添加/删除/修改以更新 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 脚本生成的,如果需要,我可以以不同的方式处理它。

4

1 回答 1

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。

于 2013-08-30T11:46:02.657 回答