Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用正确的数据类型将csv文件导入sqlite_Sqlite_Csv_Types_Import - Fatal编程技术网

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

如何使用正确的数据类型将csv文件导入sqlite,sqlite,csv,types,import,Sqlite,Csv,Types,Import,当我将csv文件导入sqlite数据库时,它会将数字作为字符串导入整数列,如何解决这个问题?我的csv文件中的一行如下所示: 31,c,BB ROSE - 031,c31,,9,7,0,"142,000",0 UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER) .header ON select * from table1 order by wert; CSV文件没有数据类型;一切都是一根弦 要将列中的所有值转换为数字,请使用以

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

 31,c,BB ROSE - 031,c31,,9,7,0,"142,000",0
UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)
.header ON
select * from table1 order by wert;

CSV文件没有数据类型;一切都是一根弦

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

 31,c,BB ROSE - 031,c31,,9,7,0,"142,000",0
UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)
.header ON
select * from table1 order by wert;

在SQLite中,不能更改列的类型亲缘关系。因此,您应该
创建
您的表,然后
。将
您的CSV文件导入表中。如果您的CSV文件有一个标头,则在导入时将其视为数据。您可以在导入前删除标题(在CSV文件中),也可以在导入后删除标题(在表中)。由于
类型的
所有标题字段都将是
文本
,因此您可以在某些列具有数字类型亲缘关系的表中轻松找到此标题。

导入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
但是,据我所知,您不能使用
altertable
语句来修改SQLite中的列相反,您需要重命名该表,创建一个新表,然后将数据复制到新表中。

所以,假设我有一个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字段,该字段将重命名该表,创建一个新表,并将数据复制到新表中

$ sqlite3 mydb.sqlite
sqlite> .once employees.sql
sqlite> .schema employees
sqlite> .quit
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文件之前或之后删除标题。

您只需先创建具有正确类型的表,然后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.
最后,您可以像下面这样检查正确的导入:

 31,c,BB ROSE - 031,c31,,9,7,0,"142,000",0
UPDATE MyTable SET MyColumn = CAST(MyColumn AS INTEGER)
.header ON
select * from table1 order by wert;
  • 将CSV文件导入SQLite
  • 转到数据库结构并选择导入的CSV文件
  • 从选项卡中选择“修改表”
  • 选择字段1并将名称更改为所需的列名称
  • 接下来,从下拉菜单中选择所需的数据类型。现在,您可以根据使用的数据从文本更改为整数或数字

  • 请包括您的表格模式。请解释您的反对票。你确定你理解为什么建议这样做而不是
    CAST
    ?如果你对如何做感兴趣:看看是否要从MyTable中删除正确的内容(安全第一)
    选择*,其中MyColumn='HeaderName'
    ,然后从MyTable中删除MyColumn='HeaderName',虽然这已经得到了回答,但我很感激您为我的用例编写的内容。这不起作用。在SQLite中不能修改这样的列。该列未更改。@Spacedman很可能是您导入了一个表,其中该列是用文本声明的。我没有导入到任何现有表中-如果您将CSV导入到一个新表中,您会得到文本表,这就是问题所在。解决方法是先创建表,然后使用正确的类型进行操作,而无需进行任何更新。