如何将JSON文件转换为SQLite数据库

时间:2017-09-25 14:32:19

标签: json sqlite

如果我有一些样本数据,如何将其放入SQLite(最好是完全自动化)?

{"uri":"/","user_agent":"example1"}
{"uri":"/foobar","user_agent":"example1"}
{"uri":"/","user_agent":"example2"}
{"uri":"/foobar","user_agent":"example3"}

3 个答案:

答案 0 :(得分:2)

我发现最简单的方法是使用jq和CSV作为中间格式。

获取CSV

首先将数据写入文件。 我将在这里假设 data.json

然后使用jq构建标题:

% head -1 data.json | jq -r 'keys | @csv'
"uri","user_agent"

head -1是因为我们只需要一行。 jq' s -r使输出为纯字符串,而不是包装CSV的JSON-String。 然后,我们调用内部函数keys以将输入的键作为数组获取。 我们发送给@csv格式化程序,该格式化程序向我们输出一个字符串,其中包含引号为CSV格式的标题。

然后我们需要构建数据。

% jq -r '[.[]] | @csv' < data.json
"/","example1"
"/foobar","example1"
"/","example2"
"/foobar","example3"

我们现在使用.[]获取整个输入并解构关联数组(map),然后将其放回到简单数组[…]中。 这基本上将我们的字典转换为键数组。 发送到@csv格式化程序后,我们再次获得一些CSV。

将所有内容放在一起,我们得到一个单行内容:

% (head -1 data.json | jq -r 'keys | @csv' && jq -r '[.[]] | @csv' < data.json) > data.csv

如果您需要动态转换数据,即没有文件,请尝试:

% cat data.json | (read -r first && jq -r '(keys | @csv),( [.[]] | @csv)' <<<"${first}" && jq -r '[.[]] | @csv')

将其加载到SQLite

打开SQLite数据库:

sqlite3 somedb.sqlite

现在在交互式shell中执行以下操作(假设您将CSV写入 data.csv 并希望将其放在名为my_table的表中):

.mode csv
.import data.csv my_table

现在关闭shell并再次打开它以获得干净的环境。 您现在可以从数据库中轻松SELECT并执行您想要的任何操作。

全部放在一起

在那里录制asciinema

asciicast

答案 1 :(得分:2)

没有中间CSV或第三方工具的一种方法是将SQLite的JSON1 extensionsqlite3 CLI工具中提供的readfile extension结合使用。

如果输入文件是格式正确的JSON文件,例如以数组形式给出的示例:

[
{"uri":"/","user_agent":"example1"},
{"uri":"/foobar","user_agent":"example1"},
{"uri":"/","user_agent":"example2"},
{"uri":"/foobar","user_agent":"example3"}
]

然后可以将其读取到相应的my_table表中,如下所示。使用sqlite3 CLI打开SQLite数据库文件my_db.db

sqlite3 my_db.db

然后使用以下方法创建my_table

CREATE TABLE my_table(uri TEXT, user_agent TEXT);

最后,可以使用CLI命令将my_data.json中的JSON数据插入表中:

INSERT INTO my_table SELECT 
  json_extract(value, '$.uri'), 
  json_extract(value, '$.user_agent')
FROM json_each(readfile('my_data.json'));

除了总体上是一个“更直接”的解决方案之外,它还具有比CSV更一致地处理JSON NULL值的优点,否则它将作为空字符串导入。

如果初始JSON文件是用换行符分隔的JSON元素,则可以首先使用jq使用以下命令进行转换:

jq -s <my_data_raw.json >my_data.json

很可能有一种方法可以使用JSON1在SQLite中直接执行此操作,但是鉴于我已经在导入到SQLite之前已经使用jq对数据进行了按摩,因此我没有这么做。 / em>

答案 2 :(得分:0)

sqlitebiter似乎提供了一个python解决方案:

用于将CSV / Excel / HTML / JSON / LTSV / Markdown / SQLite / TSV / Google-Sheets转换为SQLite数据库文件的CLI工具。 http://sqlitebiter.rtfd.io/

文档: http://sqlitebiter.readthedocs.io/en/latest/

项目: https://github.com/thombashi/sqlitebiter

  • 最近更新大约3个月前
  • 上个期约1个月前关闭,没有开放
  • 今天注明,2018-03-14