Table
如何為表創建腳本自動檢測 csv 文件的列類型?
我是 pgAdmin 和 Azure 數據庫的新手。我有一個包含大約 220 列的巨大 csv 文件,我想在 pgAdmin4 中創建一個表以將其推送到 Azure。
但是我不知道如何自動檢測列的類型。
這是一個例子:
IDI GKID S01Q01 S02Q01_Gender ... 100093 enq030059569748fc89091fdd91cc337cac44eca90 Yes, I agree Female ...
我正在編寫腳本來創建表格。但是,考慮到列的數量,我想自動化它以獲取允許我將 csv 添加到 Microsoft Azure 的 pgAdmin4 中的數據庫的腳本。
然後,在轉置 csv 標頭後,我得到:
IDI GKID S01Q01 S02Q01_Gender ...
我正在編寫腳本來創建表格。但是,考慮到列的數量,在最好的情況下,我希望自動檢測列的類型以便能夠將其寫入正確的部分,在最壞的情況下,放置 TEXT 類型的泛型類型。
到目前為止,我已經嘗試過
output = "" file_name = "columns.txt" string_to_add = " TINYTEXT," with open(file_name, 'r') as f: file_lines = [''.join([x.strip(), string_to_add, '\n']) for x in f.readlines()] with open(file_name, 'w') as f: f.writelines(file_lines)
它給了我:
IDI TINYTEXT, GKID TINYTEXT, S01Q01 TINYTEXT, S02Q01_Gender TINYTEXT, ...
然後,我可以這樣做:
CREATE TABLE my_table ( IDI TINYTEXT, GKID TINYTEXT, S01Q01 TINYTEXT, S02Q01_Gender TINYTEXT, ...
但我不確定這是否足以使表格能夠接收我的 csv 文件。
有一些命令行工具可以進行欄位類型推斷。
一個是 xsv https://github.com/BurntSushi/xsv/
xsv stats input.csv --everything | xsv table
你有
field type sum min max min_length max_length mean stddev median mode cardinality id Integer 5050 1 100 1 3 50.5 28.86607004772212 50.5 N/A 100 first_name Unicode Annabal Willabella 3 11 N/A 98 last_name Unicode Albinson Zaniolini 3 13 N/A 100 f Float 2063.2419999999984 0.2656 51.1245 4 7 20.632419999999996 12.603955889545158 17.930799999999998 N/A 100
使用 csvkit ( https://csvkit.readthedocs.io/en/latest/index.html ) 並執行
csvstat --csv input.csv
你將會有
column_id column_name type nulls unique min max sum mean median stdev len freq 1 id Number False 100 1 100 5,050 50.5 50.5 29.011 - 1, 2, 3, 4, 5 2 first_name Text False 98 - - - - - - 11 Caren, Weylin, Heall, Flori, Lydia 3 last_name Text False 100 - - - - - - 13 Saxby, Joderli, Kleinzweig, Coyle, Kleinplac 4 f Number False 100 0.266 51.124 2,063.242 20.632 17.931 12.667 - 5.356, 12.596, 32.1245, 5.32, 0.2656
在 csvkit 你也有
csvsql -i postgresql input.csv
這給了你
CREATE TABLE input ( id DECIMAL NOT NULL, first_name VARCHAR NOT NULL, last_name VARCHAR NOT NULL, f DECIMAL NOT NULL );