Sqlite

Sqlite3導入csv列排序

  • January 11, 2022

我有一種情況,第一行有列名的 CSV 文件,它們與我的 SQLite3 db 中的表完全匹配,只是它們的順序不同。預設情況下,使用.import table1.csv table1SQLite3 只會將列名視為數據行。我希望它不將其視為數據行,而是使用它來確定應將數據添加到哪一列。這可能嗎?

編輯:範例表和 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;  

引用自:https://dba.stackexchange.com/questions/305536