Sqlite
Sqlite3導入csv列排序
我有一種情況,第一行有列名的 CSV 文件,它們與我的 SQLite3 db 中的表完全匹配,只是它們的順序不同。預設情況下,使用
.import table1.csv table1
SQLite3 只會將列名視為數據行。我希望它不將其視為數據行,而是使用它來確定應將數據添加到哪一列。這可能嗎?編輯:範例表和 CSV (但是我需要一個解決方案,它可以與任何任意表和 CSV 共享相同數量的列和相同的名稱,只是不同的順序,如下所示):
CREATE TABLE crate_owners ( crate_id INTEGER NOT NULL, owner_id INTEGER NOT NULL, created_at TEXT NOT NULL, created_by INTEGER NOT NULL, owner_kind INTEGER NOT NULL );
CSV:
crate_id,created_at,created_by,owner_id,owner_kind 208787,2020-02-14 12:34:33.454958,6128,6128,0 201200,2020-01-23 09:51:46.202886,50019,50019,0 201211,2020-01-23 10:27:14.127394,19568,19568,0 201212,2020-01-23 10:27:15.818358,19568,19568,0 ...
創建一個 awk 腳本,例如。/tmp/Max888.awk,包含
BEGIN { FS="," C["crate_id"] = 1 C["owner_id"] = 2 C["created_at"] = 3 C["created_by"] = 4 C["owner_kind"] = 5 } NR == 1 { # determine the New Order for (N=1;N<=NF;N++) { NO[N] = C[$N] } for (CO in NO) { NCO[CO] = NO[CO] } } NR > 1 { OFS="," # print $1,$2,$3,$4,$5 print $NCO[NO[1]],$NCO[NO[2]],$NCO[NO[3]],$NCO[NO[4]],$NCO[NO[5]] }
如果您的 CSV 數據包含在文件 /tmp/test.dat 中,並且您的數據庫包含在 /tmp/test.sq3 中,則可以執行
sqlite3 -csv /tmp/test.sq3 '.import "|awk -f /tmp/Max888.awk /tmp/test.dat" crate_owners'
執行以下命令或將它們放在文件中並使用
.read <filepathname>
命令:--Adjust path to location of the csv file .cd B:/datadir DROP TABLE IF EXISTS crate_owners_tmp; CREATE TABLE crate_owners_tmp (crate_id,created_at,created_by,owner_id,owner_kind); .mode csv .import data.csv crate_owners_tmp --skip 1 INSERT INTO crate_owners(crate_id,created_at,created_by,owner_id,owner_kind) SELECT * FROM crate_owners_tmp; DROP TABLE IF EXISTS crate_owners_tmp;