【问题标题】:SQLite3 Import CSV & exclude/skip headerSQLite3 导入 CSV 并排除/跳过标题
【发布时间】:2012-11-15 06:08:29
【问题描述】:

我正在尝试将我的数据文件(其中有十几个)放入 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;
>

我是否弄错了测试相等性的语法?我不知道; the docs 似乎无法区分两者。我想我会再试一次...

> .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 时有一个简单的选项可以跳过标题行,因为在文本文件中包含标题行是一种相当常见的情况。

【问题讨论】:

  • 你不应该有这个问题......你的csv的第一行应该自动以INSERT failed: datatype mismatch结束,因为你有INT字段。
  • 谢谢,虽然我在八年前解决了这个问题。

标签: sqlite csv import


【解决方案1】:

对@steven-penny 的另一种回应

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

.mode csv
.import '| tail -n +2 artist_t.csv' artist_t

【讨论】:

    【解决方案2】:

    这对我有用:

    .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

    【讨论】:

      【解决方案3】:

      将 csv 导入新表并将新表的数据复制到原始目标表,这样可以吗?

      【讨论】:

      • 可能会,但我不再为同一个人工作,更不用说同一个项目了!
      【解决方案4】:

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

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

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

      【讨论】:

      • 啊,哈!谢谢,我没有注意到这种微妙的细微差别。
      • 为了确定,正确删除的条件应该是 WHERE patid = " 'patid' ",对吗?
      • @gvrocha 不," '...' " 没有意义。
      • 还是没有可以处理带头文件的导入选项吗?
      • @martin 仅当表尚不存在时。
      猜你喜欢
      • 2017-09-21
      • 2010-10-08
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2018-04-03
      • 2013-04-08
      • 1970-01-01
      相关资源
      最近更新 更多