【发布时间】:2010-04-20 14:43:00
【问题描述】:
我尝试使用 .import,但它似乎受限于 csv 和分隔文件。是否可以导入 gzip 文件?或者至少,从命令行管道?
另外,我可以跳过一些不需要的列,比如 mysql "LOAD DATA INFILE" 吗?
【问题讨论】:
我尝试使用 .import,但它似乎受限于 csv 和分隔文件。是否可以导入 gzip 文件?或者至少,从命令行管道?
另外,我可以跳过一些不需要的列,比如 mysql "LOAD DATA INFILE" 吗?
【问题讨论】:
如果你不想使用命名管道,你也可以:
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"
【讨论】:
$ 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 的新手,当时我发现了这个答案并发现这些答案很有帮助:stackoverflow.com/questions/4113986/… 和 askubuntu.com/questions/449132/…
zcat data.gz |\
cat <(echo -e ".separator ','\n.import /dev/stdin dest_table") - |\
sqlite3 db.sqlite
运行良好(linux)。
【讨论】:
您可以创建命名管道。它将像普通文件一样工作,但会即时解压缩。 SQLite 对此一无所知。
原来维基百科上的例子是使用 gzip 的。 http://en.wikipedia.org/wiki/Named_pipe
【讨论】:
您可以为数据编写一个解析器,将其转换为一系列 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"
【讨论】: