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

如何将JSON文件转换为SQLite数据库,json,sqlite,sqlite-json1,Json,Sqlite,Sqlite Json1,如果我有一些示例数据,如何将其放入SQLite(最好是全自动的) 我发现最简单的方法是使用和CSV作为中间格式 编辑: 正如所指出的(谢谢),最初的问题确实显示了换行符分隔的JSON对象,它们各自都符合该格式,但并非全部都符合该格式。 jq可以通过使用jq.[]”preprocessed.JSON对文件进行预处理来处理单个JSON对象数组,但处理方式与处理方法基本相同。 如果您碰巧正在处理JSON文本序列(),幸运的是jq也支持您使用--seq参数 编辑2: 换行符分隔的JSON和JSON文本序

如果我有一些示例数据,如何将其放入SQLite(最好是全自动的)


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

编辑: 正如所指出的(谢谢),最初的问题确实显示了换行符分隔的JSON对象,它们各自都符合该格式,但并非全部都符合该格式。 jq可以通过使用
jq.[]”preprocessed.JSON对文件进行预处理来处理单个JSON对象数组,但处理方式与处理方法基本相同。
如果您碰巧正在处理JSON文本序列(),幸运的是jq也支持您使用
--seq
参数

编辑2: 换行符分隔的JSON和JSON文本序列都有一个重要的优点;它们将内存需求降低到O(1),这意味着您的总内存需求仅取决于最长的输入行,而将整个输入放在单个数组中需要解析器能够处理延迟错误(即,在前100k个元素之后出现语法错误),就我所知,通常情况下并非如此,或者它必须对整个文件进行两次解析(首先验证语法,然后进行解析,在这个过程中丢弃以前的元素,就像
jq--stream
)的情况一样,据我所知,这种情况也很少发生,否则它将尝试一次解析整个输入并在一步中返回结果(想象一下接收一个Python dict,它包含整个(比如说)50G输入数据加上开销),它通常是内存备份的,因此将内存占用提高了大约总数据大小

编辑3: 如果遇到任何障碍,请尝试使用未排序的关键点而不是关键点。 不过,我自己还没有测试过(我假设我的专栏已经排序过了)

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

然后使用
jq
构造标题:

% head -1 data.json | jq -r 'keys | @csv'
"uri","user_agent"
head-1
是因为我们只需要一行。
jq
-r
使输出成为普通字符串,而不是包装CSV的JSON字符串。 然后我们调用内部函数
keys
,以获取作为数组的输入键。 我们将其发送到
@csv
格式化程序,该格式化程序以引用的csv格式输出带有标题的单个字符串

然后我们需要构建数据

% jq -r '[.[]] | @csv' < data.json
"/","example1"
"/foobar","example1"
"/","example2"
"/foobar","example3"
如果需要动态转换数据,即不需要文件,请尝试以下操作:

% cat data.json | (read -r first && jq -r '(keys | @csv),( [.[]] | @csv)' <<<"${first}" && jq -r '[.[]] | @csv')
现在在交互式shell中执行以下操作(假设您将CSV写入data.CSV,并希望它位于名为
my_table
)的表中):

现在关闭外壳并再次打开,以获得干净的环境。 现在,您可以从数据库中轻松地
选择
,并执行任何您想执行的操作

把它们放在一起 在那里有一段录音:


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

用于将CSV/Excel/HTML/JSON/LTSV/Markdown/SQLite/TSV/Google工作表转换为SQLite数据库文件的CLI工具

文件:

项目:

  • 上次更新大约3个月前
  • 上一期大约在1个月前结束,没有一期尚未发行
  • 今日注明,2018-03-14

在没有CSV或第三方工具的情况下实现这一点的方法是使用SQLite与
sqlite3
CLI工具中提供的相结合

如果输入文件是格式良好的JSON文件,例如作为数组给出的示例:

[
{“uri”:“/”,“用户\代理”:“example1”},
{“uri”:“/foobar”,“用户\代理”:“example1”},
{“uri”:“/”,“用户\代理”:“示例2”},
{“uri”:“/foobar”,“用户\代理”:“example3”}
]
然后可以将其读入相应的
my_table
表,如下所示。使用sqlite3 CLI打开SQLite数据库文件
my_db.db

sqlite3 my_db.db
然后使用以下方法创建
my_表

jq -s <my_data_raw.json >my_data.json
创建表我的表(uri文本、用户代理文本);
最后,可以使用CLI命令将
my_data.JSON
中的JSON数据插入表中:

插入我的表格选择
json_extract(值“$.uri”),
json_extract(值“$.user_agent”)
来自json_each(readfile('my_data.json');
总体而言,这是一个“更直接”的解决方案,它的优点是处理JSON空值比处理CSV更一致,否则CSV会将它们作为空字符串导入

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

jq -s <my_data_raw.json >my_data.json
jq-s my_data.json

很可能有一种方法可以使用JSON1直接在SQLite中实现这一点,但我没有这样做,因为我已经在使用
jq
在导入到SQLite之前对数据进行了处理。

同时提问和回答?回答自己的问题没有错,只要对其他人有价值。这是一个很好的书面回答。Bu这真的是两个问题合一,答案分为两个部分,这很明显,所以可能应该分开发布。但是可能会有重复的…@glennsl我对如何完成任务有一个模糊的想法,但首先查找它,没有看到任何结果,所以我解决了它,并认为填补空白会很好SO知识库中的y空格。@lad2025这就是提问时“回答您自己的问题”复选框的作用。为了搜索,这就是JSONL(JSON行)格式,而不是JSON。我发现我需要使用
keys\u unsorted
,以便键的顺序与记录的顺序相同:请注意
jq-s my\u data。JSON
将消耗相当多的内存,这取决于您要转换的数据库的大小。我一直在使用30G以上的数据库,在这种情况下,这将需要比手边的设备可以提供。我会在我的答案中添加一两个词。@benaryorg很好。我想在SQLite中有一种相对简单的方法可以直接做到这一点,因为他们的JSON1扩展非常强大,尽管它是se
.mode csv
.import data.csv my_table
sqlite3 my_db.db
jq -s <my_data_raw.json >my_data.json