2016-06-08 138 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