2016-06-08 139 views
0

我已经设法将多个csv文件(包含在一个文件夹中)导入到SQLite数据库中 - 这要感谢我在之前的 question on this forum上收到的非常有用的反馈。通过Python在SQLite数据库中合并数据

A16_B1_T5A16_B1_T6包含来自同一传感器的数据,测量温度和湿度。然而,它们是在一年的不同时间收集的,因此它们总是有重要的重叠(即T5可能表示2015年4月 - > 10月收集的数据,而2015年7月 - > 2015年12月)。

我现在试图将两个或多个表(最初对应于单独的csv文件)合并为一个。对于参考示例,应将A16_B1_T5和A16_B1_T6合并到A16_B1_T(或A16_B1_TT)中。这意味着追加以及覆盖/删除重复数据。

有关如何做到这一点的任何提示?批量导入CSV到sqlite的原工作代码如下:

import csv 
import sqlite3 
import glob 
import os 

def do_directory(dirname, db): 
    for filename in glob.glob(os.path.join(dirname, '*.csv')): 
     do_file(filename, db) 

def do_file(filename, db): 
     with open(filename) as f: 
      with db: 
       data = csv.DictReader(f) 
       cols = data.fieldnames 
       table=os.path.splitext(os.path.basename(filename))[0] 

       sql = 'drop table if exists "{}"'.format(table) 
       db.execute(sql) 

       sql = 'create table "{table}" ({cols})'.format(
        table=table, 
        cols=','.join('"{}"'.format(col) for col in cols)) 
       db.execute(sql) 

       sql = 'insert into "{table}" values ({vals})'.format(
        table=table, 
        vals=','.join('?' for col in cols)) 
       db.executemany(sql, (list(map(row.get, cols)) for row in data)) 

    if __name__ == '__main__': 
     connection = sqlite3.connect('C:/ROAST/3_ANALYSIS/03_SQL-PY/primo.db') 
do_directory('C:/ROAST/3_ANALYSIS/03_SQL-PY\A08_csv',connection) 

回答

0

你只需要创建新表和使用两个INSERT INTO <newtable> SEÇECT <collunmns_wanted> FROM <old_table_1>到sqlite的引擎。

完整文档的INSERT是在这里:你的回答 https://www.sqlite.org/lang_insert.html

+0

jsbueno,谢谢。这可以在Python代码中实现,而不是在SQLite环境中使用? – Andreuccio

+0

您只需从Python内发出SQL语句 - 作为'db.execute'的参数 – jsbueno

+0

再次感谢。但是,从您的回复看来,这会为新表创建更多列,这不是我想要的。 我想要有相同数量的clumns并追加/覆盖行。 – Andreuccio