Как импортировать 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-файла.