sqlite:如果列数不相等,如何将csv文件导入到表中?

时间:2016-04-20 13:07:33

标签: import sqlite

我在sqlite-database中有一个表为空,表的第一列是autoincrement主键。我想导入一个没有id的csv文件:它具有与表一样多的列但只有一个(id)。如何将csv文件中的值导入到表的相应列中?

这是一个极端的例子(Windows 7,DOS):

REM -- Create csv-file
type NUL > data.csv
echo 'a1','b1' >> data.csv
echo 'a2','b2' >> data.csv
type data.csv
'a1','b1'
'a2','b2'

REM -- create database and tables
sqlite3 test.db "SELECT 1;"
sqlite3 test.db "CREATE TABLE tab0 (va TEXT, vb TEXT);"
REM this table has 3 columns:
sqlite3 test.db "CREATE TABLE tab1 (id INTEGER NOT NULL PRIMARY KEY, va TEXT, vb TEXT);"

REM -- Import csv file where number of columns are equal
sqlite3 -separator "," test.db ".import 'data.csv' tab0"
sqlite3 test.db
sqlite> select * from tab0;
'a1'|'b1'
'a2'|'b2'

REM -- Import csv file where number of columns are NOT equal
sqlite3 -separator "," test.db ".import 'data.csv' tab1"
data.csv:1: expected 3 columns bit found  - filling the rest with NULL
data.csv:1: INSERT failes: datatype mismatch
data.csv:2: expected 3 columns bit found  - filling the rest with NULL
data.csv:2: INSERT failes: datatype mismatch

任何帮助表示感谢。

更新:有没有办法避免临时表?

3 个答案:

答案 0 :(得分:1)

使用Tab0作为临时表,您应该从中插入tab1。

INSERT INTO tab1(va, vb) SELECT * FROM tab0;

查看此答案https://stackoverflow.com/a/15998236/2591314

答案 1 :(得分:1)

您可以使用tab0填充tab1。

类似

INSERT INTO tab1( va,vb )
SELECT  va, vb
FROM    tab0

应该有效。

答案 2 :(得分:1)

您可以将自动增量字段移动到表的末尾,其中缺失值将在导入时被null替换,因此被自动增量值替换(" NOT NULL"暗示,所以你不要&# 39; t需要它):

CREATE TABLE tab1 (va TEXT, vb TEXT, id INTEGER PRIMARY KEY)