如何确定字段是否存在于任何其他行的另一个字段的同一个表中

时间:2012-10-21 21:29:53

标签: python sqlite csv

我很难发现我是否能做到这一点。基本上,我有一个csv文件,如下所示:

1111,804442232,1
1112,312908721,1
1113,A*2434,1
1114,A*512343128760987,1
1115,3512748,1
1116,1111,1
1117,1234,1

将其导入内存中的sqlite数据库以进行操作。经过一些操作后,我将把多个文件导入到这个数据库中。 Sqlite允许我对表保持约束并在需要时接收错误而不创建额外的函数只是为了在python中使用数组时检查每个约束。我想做一些事情,但第一个是在pre2之前添加所有field2字符串与field1中的条目匹配。

例如,在上面的数据中,条目6中的field2与条目1匹配。在这种情况下,我想在条目6中添加field2 '555'

如果这是不可能的,我相信我可以使用正则表达式,只需在field2中的4位数的每一行上执行此操作...虽然...我还没有成功地使用REGEX工作python / sqlite因为它总是抛出一个错误。

我在Python中使用Sqlite3来连接/操作我的sqlite数据库。

编辑:我正在寻找一种方法来操作驻留在sqlite数据库中的结果表,而不是只操纵csv数据。上面的数据只是我正在使用的文件中包含的内容的简单表示。使用包含csv文件数据的数组会更好吗?这些文件有10,000多个条目和大约20-30列。

3 个答案:

答案 0 :(得分:2)

如果你必须在SQLite中这样做,那该怎么做:

首先,通过运行以下内容并解析结果

来获取表的列名
def get_columns(table_name, cursor):
    cursor.execute('pragma table_info(%s)' % table_name)
    return [row[1] for row in cursor]

conn = sqlite3.connect('test.db')
columns = get_columns('test_table',conn.cursor())

对于每个列,运行以下更新,该更新将执行前置

def prepend(column, reference, prefix, cursor):
    query = '''
        UPDATE %s
        SET %s = 'prefix' || %s
        WHERE %s IN (SELECT %s FROM %s)
    ''' % (table, column, column, column, reference, table)
    cursor.execute(query)

reference = 'field1'
[prepend('test_table', column, reference, '555', conn.cursor()) 
    for column in columns 
    if column != reference]

请注意,这很昂贵:要为每个列执行O(n ^ 2)。

根据您的编辑和Nathan的回答,简单地使用python的内置数据结构可能更好。您可以随后将其插入SQLite。

10,000个条目实际上并不多,所以最终可能无关紧要。这完全取决于你要求在SQLite中完成的原因(我们没有太多的可见性)。

答案 1 :(得分:1)

不需要使用正则表达式来执行此操作,只需将第一列中的内容放入set,然后遍历行并更新第二个字段。

first_col_values = set(row[0] for row in rows)
for row in rows:
    if row[1] in first_col_values:
        row[1] = '555' + row[1] 

答案 2 :(得分:1)

所以...在我自己的搜索和反复试验之后,我找到了自己问题的答案。我对SQL的不熟悉让我感到难过,因为我正在尝试各种疯狂的事情。最后......这是我正在寻找的简单解决方案类型:

prefix="555"
cur.execute("UPDATE table SET field2 = %s || field2 WHERE field2 IN (SELECT field1 FROM table)"% (prefix))

我在那里保留了少量的python但我正在寻找的是SQL语句。不知道为什么没有其他人想出一些简单的东西= /。到目前为止对答案不满意,我一直在寻找这条简单的行> _<。