如何使用正确的数据类型将csv文件导入sqlite

时间:2013-11-27 10:47:40

标签: sqlite csv types import

当我将csv文件导入sqlite数据库时,它将数字作为字符串导入整数列,我该如何解决?我的csv文件中的一行如下:

 31,c,BB ROSE - 031,c31,,9,7,0,"142,000",0

5 个答案:

答案 0 :(得分:12)

CSV文件没有数据类型;一切都是一个字符串。

要将列中的所有值转换为数字,请使用以下内容:

UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)

答案 1 :(得分:1)

在SQLite中,您无法更改列的类型关联。因此,您应该create您的表格,然后将.import您的CSV文件放入表格中。如果您的CSV文件有标题,则会在导入时将其视为数据。您可以在导入之前删除标题(在CSV文件中),也可以在导入后删除标题(在表格中)。由于typeof所有标题字段都为TEXT,因此您可以在表格中轻松找到此标题,其中某些列具有数字类型的亲和力。

答案 2 :(得分:1)

导入csv文件时,SQLite假定所有字段均为文本字段。因此,您需要执行一些额外的步骤才能设置正确的数据类型。

但是,据我了解,您不能使用ALTER TABLE语句来修改SQLite中的列。 相反,您将需要重命名表,创建新表并将数据复制到新表中。

https://www.techonthenet.com/sqlite/tables/alter_table.php

因此,假设我有一个 employees.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

首先,创建一个名为mydb.sqlite的SQLite数据库,并将employees.csv导入一个名为employees的SQLite表中。

# 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

您现在应该具有具有以下架构的 employees.sql

CREATE TABLE employees(
  "employee_id" TEXT,
  "last_name" TEXT,
  "first_name" TEXT,
  "hire_date" TEXT
);

现在我们创建一个名为 alterTable.sql 的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;

最后,我们可以在alterTable.sql中执行SQL并删除旧的重命名表

$ sqlite3 mydb.sqlite
sqlite> .read alterTable.sql
sqlite> drop table _employees_old;

这时,导入的员工数据应具有正确的数据类型,而不是默认的文本字段。

如果采用这种方式,则不必担心csv文件中的标头作为数据导入。其他方法可能要求您在导入csv文件之前或之后删除标头。

答案 3 :(得分:0)

您只需要先使用正确的类型创建表,然后CSV导入将保留此类型,因为表已经存在。

这里有一个样本:

create table table1(name TEXT, wert INT);
.mode csv
.separator ";"
.import "d:/temp/test.csv" table1

如果您需要删除导入的标题行,则在导入后使用以下内容:

delete from table1 where rowid=1;

或在已经多次导入同一表的情况下使用此方法:

delete from [table1] where "name"='name'; -- try to use a name of an INT-column for this.

最后,您可以像这样检查正确的导入:

.header ON
select * from table1 order by wert;

答案 4 :(得分:0)

  1. 将CSV文件导入SQLite。
  2. 转到数据库结构并选择导入的CSV文件
  3. 从标签中选择修改表
  4. 选择字段一,然后将名称更改为所需的列名。
  5. 接下来,从下拉菜单中选择所需的数据类型。现在,您可以根据要处理的数据从“文本”更改为“整数”或“数字”

enter image description here