如何导入csv文件到sqlite与正确的数据类型

bwitn5fc  于 2022-12-30  发布在  SQLite
关注(0)|答案(6)|浏览(419)

当我导入一个csv文件到sqlite数据库时,它会将数字作为字符串导入到整数列中,我该如何解决这个问题?

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

neekobn81#

CSV文件没有数据类型;一切都是一根弦。
要将一列中的所有值转换为数字,请使用以下代码:

UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)
drkbr07n

drkbr07n2#

当导入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字段,它将重命名表、创建一个新表并将数据复制到新表中。

更改表.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文件之前或之后删除标题。

b0zn9rqh

b0zn9rqh3#

您只需要首先使用正确的类型创建表,然后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;
lb3vh1jj

lb3vh1jj4#

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

dluptydi

dluptydi5#

1.将CSV文件导入SQLite。
1.转到数据库结构并选择导入的CSV文件
1.从选项卡中选择修改表
1.选择字段1并将名称更改为所需的列名称。
1.接下来,从下拉菜单中选择所需的数据类型。现在,您可以根据正在处理的数据从文本更改为整数或数值

5ktev3wc

5ktev3wc6#

我使用的是sqlite 3.39.4,我会做如下操作:
按照上面的建议,创建一个具有正确类型的新表“newtable”,然后从“mycsvtable. csv”导入数据,键入

.mode csv
.import --skip 1 mycsvtable.csv newtable

如果csv中有标题,--skip 1将避开第一行

相关问题