是否可以将 .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(或awksed,等等)。

例如,如果您的文件已经使用竖线字符作为分隔符,并且您只想导入第 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 / 我可以在导入时跳过某些列吗?的主要内容,如果未能解决你的问题,请参考以下文章

Android将Excel表数据导入SQLite数据库

如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1

如何将 sqlite 数据库 表 的 数据 导出 成txt文件?

如何将大于 RAM 限制的 gzip 文件导入 Pandas DataFrame? 《杀戮9》用HDF5?

如何将加载 .sql 或 .csv 文件导入 SQLite?

将具有以下结构的 csv 文件导入 SQLite