2017-09-25 67 views
0

如果我有一些示例数据,我该如何将它放入SQLite(最好是完全自动化的)?如何将JSON文件转换为SQLite数据库

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

自问自答:

全部放在一起

asciinema记录在那里? – lad2025

+0

回答你自己的问题没有错,只要它对别人有价值。这是一个写得很好的答案。但是这其中只有两个问题,通过回答的两个部分来表现非常明显,因此应该单独发布。但后来可能有重复... – glennsl

+0

@glennsl我对如何完成任务有一个模糊的想法,但是先查找它并没有看到任何结果,所以我解决了它,并认为这将是很好的填补SO知识库中的空白空间。 – benaryorg

回答

0

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

取得CSV

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

然后构建使用jq头:

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

head -1是因为我们只想要一条线。 jq-r使输出成为一个纯字符串,而不是包装CSV的JSON-String。 然后,我们调用内部函数keys以将输入的键作为数组获取。 我们发送给@csv格式化程序,它输出带有CSV格式标题的单个字符串。

然后我们需要构造数据。

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

我们现在把整个输入和解构使用.[]关联数组(图),然后把它放回一个简单的数组[…]。 这基本上将我们的字典转换为一个键数组。 发送到@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 

现在关闭外壳,然后再次打开它了干净的环境。 您现在可以轻松地从数据库中SELECT中做任何你想做的事情。同时

asciicast

相关问题