0

我很难确定我是否可以做到这一点。基本上,我有一个如下所示的 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 中使用数组。我想做一些事情,但首先是在 field2 前面添加所有field2字符串与field1.

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

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

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

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

4

3 回答 3

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 中完成的原因(我们没有太多可见性)。

于 2012-10-22T00:15:15.707 回答
1

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

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

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

于 2012-10-22T03:30:28.233 回答
1

无需使用正则表达式来执行此操作,只需将第一列的内容放入 a 中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] 
于 2012-10-21T21:36:48.853 回答