2010-04-20 98 views

回答

1

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

原来,维基百科上的例子是用gzip。 http://en.wikipedia.org/wiki/Named_pipe

+0

出于某种原因,我一直有命名管道的问题;如果要进行复杂的文件操作,并且需要通过它来回查看,则很容易出现混乱。 – amphetamachine 2010-04-20 14:54:38

1

你可以编写一个解析器来将数据转换为一系列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" 
+0

好吧,我使用的Ubuntu的,但我更喜欢“动态”,而不是创建临时文件,因为我使用的数据非常巨大时,解压缩。 – 2010-04-20 15:19:06

7
$ 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 
+0

当我发现这个答案时,我是'mkfifo'的新手,并且发现这些答案很有用:http://stackoverflow.com/questions/4113986/example-of-using-named-pipes-in-linux-bash和http:/ /askubuntu.com/questions/449132/why-use-a-named-pipe-in​​stead-of-a-file – cjrieds 2016-06-22 05:14:55

13

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

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

如果您需要导入之前修改的东西,你可以使用perl(或awksed,等等)在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" 
+0

不幸的是/ dev/stdin在OSX上无法识别,所以我不得不求助于一个命名管道 – 2016-10-17 23:15:43

1
zcat data.gz |\ 
    cat <(echo -e ".separator ','\n.import /dev/stdin dest_table") - |\ 
    sqlite3 db.sqlite 

作品很好(Linux版)。

+0

感谢nefuson !我无法得到任何其他建议为我的使用案例工作(用7z加密的存档管道),但你的聪明的黑客做了它;-) – lyderic 2017-09-23 14:55:34

相关问题