How to import a tsv file with SQLite3
Asked Answered
W

2

61

I have a tsv (tab separated file) that I would like to import with sqlite3. Does someone know a clear way to do it?

I have installed sqlite3, but not created any database or tables yet.

I've tried the command

.import /path/filename.tsv my_new_table

but it gives me the error: no such table: my_new_table.

However, from what I'd read it should create the table automatically if it does't exist. Does it mean I need to create and use a database first, or is there another trick to importing a .tsv file into sqlite?

Whistling answered 26/9, 2014 at 18:16 Comment(0)
B
40

You should create the table, set a separator and import the data (sqlite docs).

Example for TSV:

data.tsv (tab as a separator):

Bob 30  1000
Wendy   20  900
  1. Create a table and set TAB as a separator:

    sqlite> create table people (name text, param1 int, param2 int);
    sqlite> .separator "\t"
    
  2. Import data:

    sqlite> .import data.tsv people
    

And the result is:

sqlite> select * from people;
Bob 30  1000
Wendy   20  900
Bihari answered 26/9, 2014 at 19:57 Comment(3)
Note that using .separator "\t" means that sqlite will still use csv-style rules for interpreting quotation marks, which probably isn't what you want. A better option is to use the tabs mode described in adius's answer.Leeannaleeanne
Seems like there is some logic on the names. After .separator "\t", I also had to rename from .csv to .tsvSawyor
No need to create a table. The import will do it for you. If you are happy for every column's type to be chosen for you. I did this and everything was 'text'. This might be OK for situations where you are manually exploring data to throw away later.Bearden
C
113

There is actually a dedicated mode for importing tab separated files:

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

Also if you include a header row in your tsv file, you can let sqlite automatically create the table. Just use an unused table-name during import and change the tsv file to:

name    param1  param2
Bob 30  1000
Wendy   20  900
Cherenkov answered 17/2, 2016 at 10:29 Comment(3)
don't put a semi-colon at the end of the import statement, like I did :)Ariadne
Error: no such table: peopleInfraction
.help .mode says its job is to “set output mode,” but .help .import clarifies in a note: “If neither --csv or --ascii are used, the input mode is derived from the .mode output mode”Hypophosphate
B
40

You should create the table, set a separator and import the data (sqlite docs).

Example for TSV:

data.tsv (tab as a separator):

Bob 30  1000
Wendy   20  900
  1. Create a table and set TAB as a separator:

    sqlite> create table people (name text, param1 int, param2 int);
    sqlite> .separator "\t"
    
  2. Import data:

    sqlite> .import data.tsv people
    

And the result is:

sqlite> select * from people;
Bob 30  1000
Wendy   20  900
Bihari answered 26/9, 2014 at 19:57 Comment(3)
Note that using .separator "\t" means that sqlite will still use csv-style rules for interpreting quotation marks, which probably isn't what you want. A better option is to use the tabs mode described in adius's answer.Leeannaleeanne
Seems like there is some logic on the names. After .separator "\t", I also had to rename from .csv to .tsvSawyor
No need to create a table. The import will do it for you. If you are happy for every column's type to be chosen for you. I did this and everything was 'text'. This might be OK for situations where you are manually exploring data to throw away later.Bearden

© 2022 - 2024 — McMap. All rights reserved.