是否可以将.gzip文件导入sqlite/导入时是否可以跳过某些列?

是否可以将.gzip文件导入sqlite/导入时是否可以跳过某些列?,sqlite,import,gzip,Sqlite,Import,Gzip,我尝试使用.import,但它似乎受到csv和分隔文件的限制。可以导入gzip文件吗?或者至少是命令行中的管道 另外,我是否可以跳过一些不需要的列,如mysql“加载数据填充”?您可以创建一个命名管道。它将像一个普通的文件,但解压的飞行。SQLite对此一无所知 事实证明,维基百科上的例子就是gzip 您可以为数据编写解析器,将其转换为一系列SQL语句。Perl是一种很好的语言。甚至可以 你是在一个*Nix操作系统中运行这个吗?如果是这样,您可以创建一个临时文件来保存解压缩的数据: tf="$(

我尝试使用.import,但它似乎受到csv和分隔文件的限制。可以导入gzip文件吗?或者至少是命令行中的管道


另外,我是否可以跳过一些不需要的列,如mysql“加载数据填充”?

您可以创建一个命名管道。它将像一个普通的文件,但解压的飞行。SQLite对此一无所知


事实证明,维基百科上的例子就是gzip

您可以为数据编写解析器,将其转换为一系列SQL语句。Perl是一种很好的语言。甚至可以

你是在一个*Nix操作系统中运行这个吗?如果是这样,您可以创建一个临时文件来保存解压缩的数据:

tf="$(mktemp)" &&
zcat <my_records.csv.gz >"$tf"
sqlite3 /path/to/database.sqlite3 ".import $tf"
rm -f "$tf"
tf=“$(mktemp)”&&
zcat“$tf”
sqlite3/path/to/database.sqlite3“.import$tf”
rm-f“$tf”
这就像魔术

尽管
mkfifo
确实创建了临时文件,但该文件的大小为0字节。 运行此命令时,
$zcat my_records.csv.gz>tempfile
,它将在命令提示下停止。 这允许您运行

sqlite3> .import tempfile db_table
sqlite3
完成导入命名管道后,
zcat
命令也将完成运行。然后可以删除命名管道

$ rm -f tempfile

如果不想使用命名管道,还可以:

zcat $YOURFILE.gz | sqlite3 $YOURDB.sqlite ".import /dev/stdin $TABLENAME"
如果需要在导入之前修改内容,可以在zcat和sqlite命令之间使用
perl
(或
awk
sed
,等等)

例如,如果文件已使用管道字符作为分隔符,并且只希望导入列0到3和列5到6:

zcat $YOURFILE.gz | perl -F'\|' -anle 'print join("|", @F[0..3,5..6])' | sqlite3 $YOURDB.sqlite ".import /dev/stdin $TABLENAME"
zcat data.gz|\

因为某些原因,我总是在命名管道上遇到问题;如果有一个复杂的文件操作需要大量的来回搜索,它很容易出错。我使用ubuntu,但我更喜欢“动态”而不是创建临时文件,因为我处理的数据在解压时非常庞大。当我发现这个答案并发现这些答案很有用时,我是新来的
mkfifo
:不幸的是/dev/stdin在OSX上无法识别,所以我不得不求助于一个命名的管道感谢nefuson!我无法得到任何其他适用于我的用例的建议(从7z加密档案中导出),但您的高明黑客做到了;-)
zcat $YOURFILE.gz | perl -F'\|' -anle 'print join("|", @F[0..3,5..6])' | sqlite3 $YOURDB.sqlite ".import /dev/stdin $TABLENAME"
zcat data.gz |\
  cat <(echo -e ".separator ','\n.import /dev/stdin dest_table") - |\
  sqlite3 db.sqlite