【问题标题】:Is it possible to import .gzip file into sqlite / Could I skip some column while importing?是否可以将 .gzip 文件导入 sqlite / 我可以在导入时跳过某些列吗?
【发布时间】:2010-04-20 14:43:00
【问题描述】:

我尝试使用 .import,但它似乎受限于 csv 和分隔文件。是否可以导入 gzip 文件?或者至少,从命令行管道?

另外,我可以跳过一些不需要的列,比如 mysql "LOAD DATA INFILE" 吗?

【问题讨论】:

    标签: sqlite import gzip


    【解决方案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
    

    【讨论】:

    【解决方案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,但我更喜欢“即时”而不是创建临时文件,因为我使用的数据在未压缩时非常庞大。
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2017-07-22
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多