Я хочу импортировать CSV с помощью оболочки командной строки для SQLite в Linux (версия SQLite 3.29.0) и установите соответствующие типы данных.

sqlite> .open outputSQLDB.db
sqlite> .import input.csv tmpTable

Но теперь импортированная таблица испорчена:

sqlite> .schema
CREATE TABLE DX(
  "id,field1,field2" TEXT
);

Почему поля не разделены?

В конце я просто делаю:

sqlite> CREATE TABLE myTbl (
   ...>                    id INTEGER,
   ...>                    field1 TEXT,
   ...>                    field2 INTEGER
   ...>                   );
CREATE INDEX id_index on myTbl (id);
sqlite> DROP TABLE IF EXISTS tmpTable;
0
user1581390 2 Окт 2019 в 20:14

1 ответ

Лучший ответ

Перед вставкой укажите .mode csv. Также убедитесь, что временная таблица не существует, иначе SQLite интерпретирует первую строку CSV как данные.

Перед тем как удалить временную таблицу, перенесите строки в новую таблицу с помощью команды INSERT INTO. В противном случае они будут потеряны.

Вы получите последовательность команд:

.open outputSQLDB.db
DROP TABLE IF EXISTS tmpTable;
.mode csv
.import input.csv tmpTable
CREATE TABLE myTbl (
    id INTEGER,
    field1 TEXT,
    field2 INTEGER
);
CREATE INDEX id_index on myTbl (id);
INSERT INTO myTbl (id, field1, field2)
SELECT id, field1, field2
FROM tmpTable;
DROP TABLE IF EXISTS tmpTable;

Я бы также использовал

CREATE TABLE IF NOT EXISTS myTbl (
   ...
);

Или

DROP TABLE IF EXISTS myTbl;

Перед созданием таблицы.

0
Olivier Jacot-Descombes 3 Окт 2019 в 12:51