21

我正在尝试将我的数据文件(其中有十几个)放入 SQLite 中的表中。每个文件都有一个标题,明年我会收到几次,所以我想:

  1. 避免在收到文件时编辑每个文件以删除标题;
  2. 避免依靠 shell 脚本或 Python 来执行此操作。

我定义我的表并导入数据......

> .separator "\t"
> .headers on
> CREATE TABLE clinical(
       patid      VARCHAR(20),
       eventdate  CHAR(10),
       sysdate    CHAR(10),
       constype   INT,
       consid     INT,
       medcode    INT,
       staffid    VARCHAR(20),
       textid     INT,
       episode    INT,
       enttype    INT,
       adid           INT);
> .import "Sample_Clinical001.txt" clinical
> SELECT * FROM clinical LIMIT 10;
patid   eventdate   sysdate constype    consid  medcode staffid textid  episode enttype adid
patid   eventdate   sysdate constype    consid  medcode staffid textid  episode enttype adid
471001  30/01/1997  09/03/1997  4   68093   180 0   0   0   20  11484
471001  30/01/1997  09/03/1997  2   68093   60  0   0   0   4   11485

我的第一个想法是删除有问题的行,但这并没有按预期工作,而是删除了整个表......

> DELETE FROM clinical WHERE patid = "patid";
> SELECT * FROM clinical LIMIT 3;
>

我是否弄错了测试相等性的语法?我不知道; 文档似乎没有区分两者。我以为我会再试一次...

> .import "Sample_Clinical001.txt" clinical
> SELECT * FROM clinical LIMIT 3;
patid   eventdate   sysdate constype    consid  medcode staffid textid  episode enttype adid
patid   eventdate   sysdate constype    consid  medcode staffid textid  episode enttype adid
471001  30/01/1997  09/03/1997  4   68093   180 0   0   0   20  11484
471001  30/01/1997  09/03/1997  2   68093   60  0   0   0   4   11485
> DELETE FROM clinical WHERE patid == "patid";
> SELECT * FROM clinical LIMIT 3;
> 

我在这里甚至在正确的轨道上还是在做一些愚蠢的事情?

我本来希望在调用时有一个简单的选项来跳过标题行,.import因为在文本文件中有标题行是一种相当常见的情况。

4

4 回答 4

12

patid是一个列名。
"patid"是一个带引号的列名。
'patid'是一个字符串。

条件WHERE patid = "patid"patid列中的值与其自身进行比较。

(SQLite 允许带有双引号的字符串与 MySQL 兼容,但仅限于字符串不能与表/列名混淆的情况。)

于 2012-11-27T15:27:28.157 回答
8

这对我有用:

.read schema.sql
.mode csv
.import --skip 1 artist_t.csv artist_t

或者如果你只有一个文件要导入,你可以这样做:

.import --csv --skip 1 artist_t.csv artist_t

https://sqlite.org/cli.html#importing_csv_files

于 2020-12-14T22:22:14.133 回答
1

对@steven-penny 的另一种回应

您还可以在 sqlite 导入期间使用 bash 命令

.mode csv
.import '| tail -n +2 artist_t.csv' artist_t
于 2021-09-29T06:38:00.940 回答
-3

将csv导入新表并将新表的数据复制到原始目标表,这行得通吗?

于 2019-01-10T07:27:10.827 回答