是否可以将 .gzip 文件导入 sqlite / 我可以在导入时跳过某些列吗?
Posted
技术标签:
【中文标题】是否可以将 .gzip 文件导入 sqlite / 我可以在导入时跳过某些列吗?【英文标题】:Is it possible to import .gzip file into sqlite / Could I skip some column while importing? 【发布时间】:2010-04-20 14:43:00 【问题描述】:我尝试使用 .import,但它似乎受限于 csv 和分隔文件。是否可以导入 gzip 文件?或者至少,从命令行管道?
另外,我可以跳过一些不需要的列,比如 mysql "LOAD DATA INFILE" 吗?
【问题讨论】:
【参考方案1】:如果你不想使用命名管道,你也可以:
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"
【讨论】:
不幸的是 /dev/stdin 在 OSX 上无法识别,所以我不得不求助于命名管道【参考方案2】:$ 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
的新手,当时我发现了这个答案并发现这些答案很有帮助:***.com/questions/4113986/… 和 askubuntu.com/questions/449132/…【参考方案3】:
zcat data.gz |\
cat <(echo -e ".separator ','\n.import /dev/stdin dest_table") - |\
sqlite3 db.sqlite
运行良好(linux)。
【讨论】:
感谢 nefuson!我无法得到任何其他适用于我的用例的建议(从 7z 加密存档中提取),但你的绝妙黑客做到了 ;-)【参考方案4】:您可以创建命名管道。它将像普通文件一样工作,但会即时解压缩。 SQLite 对此一无所知。
原来***上的例子是使用 gzip 的。 http://en.wikipedia.org/wiki/Named_pipe
【讨论】:
出于某种原因,我一直遇到命名管道的问题;如果要进行一个复杂的文件操作,并且需要来回查找很多东西,那么它很容易搞砸。【参考方案5】:您可以为数据编写一个解析器,将其转换为一系列 SQL 语句。 Perl 是一种很好的语言。甚至可以handle gzip'd files。
您是否在 *Nix 操作系统中运行它?如果是这样,您可以创建一个临时文件来保存解压缩的数据:
tf="$(mktemp)" &&
zcat <my_records.csv.gz >"$tf"
sqlite3 /path/to/database.sqlite3 ".import $tf"
rm -f "$tf"
【讨论】:
好吧,我使用 ubuntu,但我更喜欢“即时”而不是创建临时文件,因为我使用的数据在未压缩时非常庞大。以上是关于是否可以将 .gzip 文件导入 sqlite / 我可以在导入时跳过某些列吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1
如何将 sqlite 数据库 表 的 数据 导出 成txt文件?
如何将大于 RAM 限制的 gzip 文件导入 Pandas DataFrame? 《杀戮9》用HDF5?