2014-02-25 31 views
0

我有一個約280列的csv文件,它可能會不時變化。有沒有辦法將csv文件導入sqlite3並讓它「猜」列類型? 我正在使用python腳本來導入它。csv導入sqlite3沒有指定列類型

+0

聽起來不像一個簡單的CSV文件 - [該網站有關於簡單CSV文件的一些提示](http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles)。這裏最好的問題是詢問,你有哪些數據可以涵蓋近300列,並且是不同的? – Makoto

回答

2

如果您可以在此項目中使用第三方庫,我建議使用pandas

使用熊貓,你可以在兩個步驟做到這一點:

  1. Read CSV file into pandas DataFrame
  2. Write pandas DataFrame to SQLite

例如:

import pandas, pandas.io.sql, sqlite3 

# some sample csv data copied from: http://wesmckinney.com/blog/?p=635 
csvfilepath = '/path/to/file.csv' 

# `index_col` set to False ensures pandas doesn't use 1st col of data as index 
df = pandas.io.parsers.read_csv(csvfilepath,index_col=False) 

# connect to in-memory database for testing; replace `:memory:` w/ file path 
con = sqlite3.connect(':memory:') 
pandas.io.sql.write_frame(df, 'test_tbl', con) 
con.execute('select * from test_tbl').fetchone() 
con.close() 

查詢結果:

(u'C00410118', 
u'P20002978', 
u'Bachmann, Michele', 
u'HARVEY, WILLIAM', 
u'MOBILE', 
u'AL', 
366010290, 
u'RETIRED', 
u'RETIRED', 
250, 
u'20-JUN-11', 
None, 
None, 
None, 
u'SA17A', 
736166, 
u'A1FDABC23D2D545A1B83', 
u'P2012') 

並與內省的查詢,你可以看到大熊貓已完成創建表的工作,甚至推斷的數據類型:

con.execute("select * from sqlite_master where type='table';").fetchone()[4] 

給出:

 
CREATE TABLE test_tbl (
    [cmte_id] TEXT, 
    [cand_id] TEXT, 
    [cand_nm] TEXT, 
    [contbr_nm] TEXT, 
    [contbr_city] TEXT, 
    [contbr_st] TEXT, 
    [contbr_zip] INTEGER, 
    [contbr_employer] TEXT, 
    [contbr_occupation] TEXT, 
    [contb_receipt_amt] INTEGER, 
    [contb_receipt_dt] TEXT, 
    [receipt_desc] REAL, 
    [memo_cd] REAL, 
    [memo_text] REAL, 
    [form_tp] TEXT, 
    [file_num] INTEGER, 
    [tran_id] TEXT, 
    [election_tp] TEXT) 
+0

這是完美的!非常感謝! 我有5個CSV文件,每個280-350列。你爲我節省了很多時間來定義列類型。 – Eric

+0

這適用於我的大部分文件,但一個給我這個錯誤:pandas.parser.CParserError:標記數據的錯誤。 C錯誤:預計在行22217 19個字段,看到20我通過csv測試與此:df = pandas.read_csv(io.BytesIO(string_buffer),index_col = False) – Eric

+0

我必須看到該行最終評論。我確定格式不正確的CSV數據可能會導致此類問題。 – bernie

0

使列標題在csv中與sqlite3表中的列名相同。然後在插入數據庫之前使用type()直接讀取並檢查類型。