如何使用SQLite3导入一个tsv文件

55

我有一个tsv(制表符分隔的文件),想要用sqlite3导入。有没有人知道一个清晰的方法来做到这一点?

我已经安装了sqlite3,但还没有创建任何数据库或表。

我尝试了以下命令:

.import /path/filename.tsv my_new_table

但它给我报错:no such table: my_new_table。

然而,根据我的阅读,如果表不存在,它应该自动创建表。这是不是意味着我需要先创建和使用数据库,或者有其他的方法可以将 .tsv 文件导入到 SQLite 中?

2个回答

106

实际上,导入制表符分隔文件有专门的模式:

sqlite> .mode tabs
sqlite> .import data.tsv people

如果您在tsv文件中包含标题行,您可以让sqlite自动创建表。只需在导入过程中使用一个未使用过的表名,并将tsv文件更改为:

同时,如果您在tsv文件中包含标题行,您可以让SQLite自动创建表格。只需要在导入时使用一个未使用的表名,并将tsv文件更改为:

name    param1  param2
Bob 30  1000
Wendy   20  900

5
不要像我这样在导入语句的末尾加上分号 :) - Neil McGuigan
Error: no such table: people - user5359531
1
“.help .mode” 表示它的工作是“设置输出模式”,但是“.help .import”在注释中澄清:“如果没有使用 --csv--ascii,则输入模式将从 .mode 输出模式派生”。 - andrewdotn

40

你需要创建表格,设置分隔符并导入数据(sqlite 文档)。

TSV 的示例:

data.tsv (使用制表符作为分隔符):

Bob 30  1000
Wendy   20  900
  1. 创建一个表格,并将TAB作为分隔符:

sqlite> create table people (name text, param1 int, param2 int);
sqlite> .separator "\t"
  • 导入数据:

  • sqlite> .import data.tsv people
    

    结果是:

    sqlite> select * from people;
    Bob 30  1000
    Wendy   20  900
    

    6
    请注意,使用.separator "\t"意味着SQLite仍将使用CSV样式的规则来解释引号,这可能不是您想要的。更好的选择是使用adius答案中描述的“tabs”模式。 - Miles
    似乎名称上有一些逻辑。在使用.separator "\t"之后,我还需要将文件从.csv重命名为.tsv。 - Punnerud
    不需要创建表格,导入操作会为您完成。如果您希望每个列的类型都由系统自动选择,那么这样做是可以的。我曾经这样做过,结果所有的列都是“文本”类型。这种情况可能适用于手动探索数据并稍后丢弃的情况。 - Martin Capodici
    2
    你的维基链接已经失效了;我认为https://sqlite.org/cli.html#csv_import现在可能是正确的链接。 - Nathan Friedly

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接