我试图玩弄.import,但似乎与csv和分隔文件限制。可以导入gzip文件吗?或者至少,从命令行管道?是否有可能将.gzip文件导入sqlite /我可以在导入时跳过某个列吗?
另外,我可以跳过一些不需要的列像mysql“LOAD DATA INFILE”吗?
我试图玩弄.import,但似乎与csv和分隔文件限制。可以导入gzip文件吗?或者至少,从命令行管道?是否有可能将.gzip文件导入sqlite /我可以在导入时跳过某个列吗?
另外,我可以跳过一些不需要的列像mysql“LOAD DATA INFILE”吗?
您可以创建一个命名管道。它将像一个普通的文件一样运行,但是可以即时解压缩。 SQLite对此一无所知。
原来,维基百科上的例子是用gzip。 http://en.wikipedia.org/wiki/Named_pipe
你可以编写一个解析器来将数据转换为一系列SQL语句。 Perl是一个很好的语言。它甚至可以是handle gzip'd files。
你在* Nix OS中运行这个吗?如果是这样,你可以创建一个临时文件来保存解压缩的数据:
tf="$(mktemp)" &&
zcat <my_records.csv.gz >"$tf"
sqlite3 /path/to/database.sqlite3 ".import $tf"
rm -f "$tf"
好吧,我使用的Ubuntu的,但我更喜欢“动态”,而不是创建临时文件,因为我使用的数据非常巨大时,解压缩。 – 2010-04-20 15:19:06
$ 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
当我发现这个答案时,我是'mkfifo'的新手,并且发现这些答案很有用:http://stackoverflow.com/questions/4113986/example-of-using-named-pipes-in-linux-bash和http:/ /askubuntu.com/questions/449132/why-use-a-named-pipe-instead-of-a-file – cjrieds 2016-06-22 05:14:55
如果你不想使用命名管道,你还可以:
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"
不幸的是/ dev/stdin在OSX上无法识别,所以我不得不求助于一个命名管道 – 2016-10-17 23:15:43
zcat data.gz |\
cat <(echo -e ".separator ','\n.import /dev/stdin dest_table") - |\
sqlite3 db.sqlite
作品很好(Linux版)。
感谢nefuson !我无法得到任何其他建议为我的使用案例工作(用7z加密的存档管道),但你的聪明的黑客做了它;-) – lyderic 2017-09-23 14:55:34
出于某种原因,我一直有命名管道的问题;如果要进行复杂的文件操作,并且需要通过它来回查看,则很容易出现混乱。 – amphetamachine 2010-04-20 14:54:38