Как импортировать csv-файл в sqlite с правильными типами данных
когда я импортирую csv-файл в базу данных sqlite, он импортирует номер как строку в целочисленный столбец, как я могу это исправить? Строка из моего csv-файла:
31,c,BB ROSE - 031,c31,,9,7,0,"142,000",0
3 ответов
CSV-файлы не имеют типов данных; все является строкой.
чтобы преобразовать все значения в столбце в число, используйте что-то вроде этого:
UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)
в SQLite вы не можете изменить сродства типов столбцов. Поэтому вы должны create
ваш стол и тогда .import
ваш CSV-файл в таблицу. Если ваш CSV-файл имеет заголовок, он будет рассматриваться как данные при импорте. Вы можете либо удалить заголовок перед импортом (в CSV-файле), либо удалить заголовок после импорта (в таблице). С typeof
все поля заголовка будет TEXT
, вы можете легко найти этот заголовок в таблице, где некоторые столбцы имеют числовой тип близости.
при импорте csv-файлов SQLite предполагает, что все поля являются текстовыми полями. Поэтому вам нужно выполнить некоторые дополнительные шаги, чтобы установить правильные типы данных.
однако, насколько я понимаю, вы не можете использовать ALTER TABLE
инструкция для изменения столбца в SQLite. вместо этого, вам нужно будет переименовать таблицу, создать новую таблицу и скопировать данные в новую таблица.
https://www.techonthenet.com/sqlite/tables/alter_table.php
предположим, у меня есть человек.csv файл, который я хочу импортировать в базу данных SQLite с правильными типами данных.
employee_id,last_name,first_name,hire_date
1001,adams,john,2010-12-12
1234,griffin,meg,2000-01-01
2233,simpson,bart,1990-02-23
сначала создайте базу данных SQLite под названием mydb.sqlite
и импорт employees.csv
в таблицу SQLite с именем employees
.
# create sqlite database called mydb.sqlite
# import data from 'employees.csv' into a SQLite table called 'employees'
# unfortunately, sqlite assumes all fields are text fields
$ sqlite3 mydb.sqlite
sqlite> .mode csv
sqlite> .import employees.csv employees
sqlite> .quit
в этот момент данные импортируются как текст. Давайте сначала получим employees
схема из базы данных и сохраните ее в employees.sql
.Мы можем использовать это для создания нового сценария, который переименует таблицу, создаст новую таблицу и скопирует данные в новую таблицу.
$ sqlite3 mydb.sqlite
sqlite> .once employees.sql
sqlite> .schema employees
sqlite> .quit
теперь вы должны были человек.в SQL со следующей схемой:
CREATE TABLE employees(
"employee_id" TEXT,
"last_name" TEXT,
"first_name" TEXT,
"hire_date" TEXT
);
Давайте теперь создадим sql-файл под названием alterTable.в SQL что бы переименовать таблицу, создать новую таблицу и скопировать данные в новую таблица.
alterTable.в SQL
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE employees RENAME TO _employees_old;
CREATE TABLE employees
( "employee_id" INTEGER,
"last_name" TEXT,
"first_name" TEXT,
"hire_date" NUMERIC
);
INSERT INTO employees ("employee_id", "last_name", "first_name", "hire_date")
SELECT "employee_id", "last_name", "first_name", "hire_date"
FROM _employees_old;
COMMIT;
PRAGMA foreign_keys=on;
наконец, мы можем выполнить SQL в alterTable.sql
и отбросьте старую переименованную таблицу
$ sqlite3 mydb.sqlite
sqlite> .read alterTable.sql
sqlite> drop table _employees_old;
на данный момент импортированные данные сотрудника должны иметь правильные типы данных вместо текстового поля по умолчанию.
если вы делаете это таким образом, вам не нужно беспокоиться о заголовках в csv-файле, импортируемых как данные. Другие методы могут потребовать удаления заголовка до или после импорт csv-файла.