我有一个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有两个值。
答案 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')