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