2013-09-30 33 views
0

所以,我導入了一個CSV文件,它可以包含任意數量的行和列。我想將結果存儲在臨時表格中,例如:「TEMP_30f3724fc226e058」,而不是在多個頁面上處理CSV文件。導入CSV並創建臨時表以存儲結果

我已經得到了下面的內容,但除此之外,我不確定如何添加基本上未知數量的列和行。任何想法都會很棒。

key = '30f3724fc226e058' 
cursor = connection.cursor() 
db_name = 'TEMP_{0}'.format(key) 
cursor.execute('CREATE TEMPORARY TABLE {0} (X INT)'.format(db_name)) 
... ? 

從CSV插入數據,那麼我可以在沿CSV導入過程中的任何點拉的數據。再次感謝,

+0

[1]讀一行。 [2]計數列數。 [3]創建表格。 [4]導入剩餘的行。 –

+0

@BurhanKhalid,謝謝你,我認爲這樣做會有效果。你有沒有創建一個TABLE的例子,這個例子有8個字段,稱爲'column_1','column_2'等等...... CREATE和INSERT的一個動態例子會更好。我無法在網上找到任何看起來甚至很近的東西,也無法將我的頭圍繞在它周圍。 –

回答

1

步驟是:

  1. 讀取文件的一行,得到的列數。
  2. 用這些列數創建一個表格。
  3. 循環播放剩餘的文件。

像這樣:

import csv 
import time 

column_count = 2 # Assume we have 2 columns, which is the minimum 

with open('somefile.txt') as f: 
    reader = csv.reader(f, delimiter=',') 
    # fetch the first row, grab the column length 
    column_count = len(next(reader)) 

# Next, create the table: 

table_name = 'sometable_{0}'.format(int(time.time())) 

q = 'CREATE TEMPORARY TABLE {0} ('.format(table_name) 
q += ', '.join('col_{0} VARCHAR(255)'.format(i) for i in range(column_count)) 
q += ');' 

cur.execute(q) 
cur.commit() 

q = "INSERT INTO {0} VALUES (".format(table_name) 
q += ', '.join(('%s ' * column_count).split()) 
q += ');' 


# Now, populate it 

with open('somefile.txt') as f: 
    reader = csv.reader(f, delimiter=',') 
    for row in reader: 
     cur.execute(q, tuple(row)) 
     cur.commit() 
+1

對不起,@BurhanKhalid的緩慢回覆,我在Breaking Bad中深陷膝蓋。非常感謝以上內容,經過一段時間的折騰,我得到了滾動。只有當我使用本地sqlite3數據庫,否則你的代碼是現貨。再次感謝! –

相關問題