填充表,其中每列来自文本文件的不同行

时间:2014-10-28 03:40:12

标签: python python-2.7 sqlite

我有一个txt文件,其中一些行包含字符串,而其他一些行包含值。值对应"属于"到上一行。例如:

+'aaa'
+'bbb'
*value1
*value2
+'ccc'
*value3
+'ddd'

等。 我正在尝试创建一个表,其中第一列包含包含字符串的行,第二列包含包含值的行。我的问题是我想要的,如果字符串具有相应的值,则字符串并且值(列表)在同一行。如果字符串没有相应的值,我希望它与NULL在同一行。这样的东西:

column1  |      column2
-----------------------------
+'aaa'    |   NULL
+'bbb'    | [*value1 ,*value2]
+'ccc'    | [*value3]
+'ddd'    |   NULL
    etc

我试着这样做:

import sqlite3
db=sqlite3.connect('mydatabase.db')
cur=db.cursor()
cur.execute('CREATE TABLE mytable (mystrings TEXT, myvalues TEXT)')
with open('myfile.txt') as f:
    for line in f.readlines():
        if line.startswith('+'):
            cur.execute("INSERT INTO mytable VALUES(?))",line)
        if line.startswith('*'):
            cur.execute("INSERT INTO mytable VALUES(?))",line)
db.commit()
db.close()

但显然这是不对的,因为mytable有两个值。

1 个答案:

答案 0 :(得分:1)

您不能在找到值后立即插入值。至少应该插入仅包含mystrings列的行,然后在找到myvalues时进行更新。但是,由于每个字符串可能有多个值,因此存储键和值并执行一个插入操作非常简单:

import sqlite3

def createtable(dbname):
    db=sqlite3.connect(dbname)
    cur=db.cursor()
    cur.execute('CREATE TABLE mytable (mystrings TEXT, myvalues TEXT)')
    cur.close()
    db.close()


def dropdb(dbname):
    db=sqlite3.connect(dbname)
    cur=db.cursor()
    cur.execute('DROP TABLE mytable')
    cur.close()
    db.close()

def insert(cur, key, val):
    if key is not None:
        if len(val) == 0:
                value = None
        elif len(val) == 1:
                value = val[0]
        else:
                value = str(val)
        # print "INSERT", key, value
        cur.execute("INSERT INTO mytable VALUES(?, ?)", (key, value))

def trt(filename, dbname):
    key = None
    val = None
    db = sqlite3.connect(dbname)
    cur = db.cursor()
    try:
        with open(filename) as f:
            for line in f:
                if line.startswith('+'):
                    if  key is not None:
                        if len(val) == 0:
                            value = None
                        elif len(val) == 1:
                            value = val[0]
                        else:
                            value = str(val)
                        insert(cur, key, val)
                    print "key", line[:-1]
                    key = line[:-1]
                    val = []
                else:
                    print "value", line[:-1]
                    if val is None:
                        print "Value before first string : ignored"
                    else:
                    val.append(line[:-1])
        insert(cur, key, val)
    finally:
        cur.close()
        db.commit()
        db.close()

createdb('mydatabase.db')
trt('myfile.txt', 'mydatabase.db')