Можно ли импортировать файл .gzip в sqlite / Можно ли пропустить некоторые столбцы при импорте? - PullRequest
3 голосов
/ 20 апреля 2010

Я пытался поиграться с .import, но, похоже, он ограничен csv и файлом с разделителями. Можно ли импортировать файл gzip? или хотя бы пайп из командной строки?

Кроме того, могу ли я пропустить какой-то ненужный столбец, такой как mysql "LOAD DATA INFILE"?

Ответы [ 5 ]

14 голосов
/ 03 июня 2013

Если вы не хотите использовать именованные каналы, вы также можете:

zcat $YOURFILE.gz | sqlite3 $YOURDB.sqlite ".import /dev/stdin $TABLENAME"

Если вам нужно изменить вещи перед импортом, вы можете использовать perl (или awk, sed, что угодно) между командами zcat и sqlite.

Например, если ваш файл уже использует символ канала в качестве разделителя и вы хотите импортировать только столбцы с 0 по 3 и с 5 по 6:

zcat $YOURFILE.gz | perl -F'\|' -anle 'print join("|", @F[0..3,5..6])' | sqlite3 $YOURDB.sqlite ".import /dev/stdin $TABLENAME"
9 голосов
/ 11 июля 2012
$ mkfifo tempfile
$ zcat my_records.csv.gz > tempfile

Это работает как волшебство!

Хотя mkfifo создает временный файл, его размер составляет 0 байт. При выполнении этой команды $ zcat my_records.csv.gz > tempfile она останавливается в командной строке. Это позволяет запустить

sqlite3> .import tempfile db_table

После того как sqlite3 завершит импорт именованного канала, команда zcat также завершит работу. Затем вы можете удалить именованный канал.

$ rm -f tempfile
3 голосов
/ 21 августа 2017
zcat data.gz |\
  cat <(echo -e ".separator ','\n.import /dev/stdin dest_table") - |\
  sqlite3 db.sqlite

прекрасно работает (linux).

1 голос
/ 20 апреля 2010

Вы можете написать синтаксический анализатор для данных, который преобразует его в серию операторов SQL.Perl - хороший язык для этого.Он может даже обрабатывать файлы gzip'd .

Работаете ли вы в * Nix OS?Если это так, вы можете создать временный файл для хранения распакованных данных:

tf="$(mktemp)" &&
zcat <my_records.csv.gz >"$tf"
sqlite3 /path/to/database.sqlite3 ".import $tf"
rm -f "$tf"
1 голос
/ 20 апреля 2010

Вы можете создать именованный канал. Он будет работать как обычный файл, но распаковывается на лету. SQLite ничего об этом не узнает.

Оказывается, пример в Википедии - с gzip. http://en.wikipedia.org/wiki/Named_pipe

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...