我有一系列巨大 (40-80mb) 导出的 Google 位置历史 JSON
文件,我的任务是使用这些文件分析选定的事件数据。不幸的是,Google 在他们的 download site 中没有参数或选项来选择除“一个包含forever 的巨型 JSON 之外的任何内容。” (KML
选项是两倍大。)
像 JSON-Converter
(laexcel-test incarnation of VBA-JSON
) 这样的明显选择;用VBA逐行解析;甚至 Notepad++ 。它们都崩溃并燃烧。我认为 RegEx 可能就是答案。
This Python script 可以在两秒内从一个 40mb 的文件中提取时间戳和位置(使用 RegEx?)。 Python 是如何做到这么快的?(在 VBA 中会一样快吗?)
如果我有一个神奇的
RegEx
block ,我就可以一点一点地提取我需要的所有东西,也许是这样的逻辑:删除所有内容 除了:
当timestampMs
和WALKING
出现在*同一组[
方括号]
之间时:- 我需要
timestampMS
、和之后的 13 位数字, WALKING
之后的一到三位数。
- 我需要
如果包含更多数据更简单,例如“所有 时间戳”或“所有 事件”,我可以稍后轻松地筛选它。 目标是使文件变小,这样我就可以在不需要 rent a supercomputer 的情况下操作它,哈哈。
我尝试过改编现有的 RegEx,但我在 RegEx 和乐器方面都遇到了一个严重的问题:不管我多么努力,我只是无法理解它。所以,这确实是一个“请帮我写代码”的问题,但只是一种表达方式,今天我会通过为别人写代码来返回它!谢谢... ☺ .
}, {
"timestampMs" : "1515564666086", ◁― (Don't need this but it won't hurt)
"latitudeE7" : -6857630899,
"longitudeE7" : -1779694452999,
"activity" : [ {
"timestampMs" : "1515564665992", ◁― EXAMPLE: I want only this, and...
"activity" : [ {
"type" : "STILL",
"confidence" : 65
}, { ↓
"type" : "TILTING",
"confidence" : 4
}, {
"type" : "IN_RAIL_VEHICLE",
"confidence" : 20 ↓
}, {
"type" : "IN_ROAD_VEHICLE",
"confidence" : 5
}, {
"type" : "ON_FOOT", ↓
"confidence" : 3
}, {
"type" : "UNKNOWN",
"confidence" : 3
}, {
"type" : "WALKING", ◁―┬━━ ...AND, I also want this.
"confidence" : 3 ◁―┘
} ]
} ]
}, {
"timestampMs" : "1515564662594", ◁― (Don't need this but it won't hurt)
"latitudeE7" : -6857630899,
"longitudeE7" : -1779694452999,
"altitude" : 42
}, {
编辑:
出于测试目的,我制作了一个示例文件,代表原始文件(大小除外)。原始 JSON 可以直接从 this Pastebin link 加载,或使用 this TinyUpload link 下载为本地副本,或复制为下面的“一长行”:
{"locations" : [ {"timestampMs" : "1515565441334","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 2299}, {"timestampMs" : "1515565288606","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 12,"velocity" : 0,"heading" : 350,"altitude" : 42,"activity" : [ {"timestampMs" : "1515565288515","activity" : [ {"type" : "STILL","confidence" : 98}, {"type" : "ON_FOOT","confidence" : 1}, {"type" : "UNKNOWN","confidence" : 1}, {"type" : "WALKING","confidence" : 1} ]} ]}, {"timestampMs" : "1515565285131","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 12,"velocity" : 0,"heading" : 350,"altitude" : 42}, {"timestampMs" : "1513511490011","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 25,"altitude" : -9,"verticalAccuracy" : 2}, {"timestampMs" : "1513511369962","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 25,"altitude" : -9,"verticalAccuracy" : 2}, {"timestampMs" : "1513511179720","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 16,"altitude" : -12,"verticalAccuracy" : 2}, {"timestampMs" : "1513511059677","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 16,"altitude" : -12,"verticalAccuracy" : 2}, {"timestampMs" : "1513510928842","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 16,"altitude" : -12,"verticalAccuracy" : 2,"activity" : [ {"timestampMs" : "1513510942911","activity" : [ {"type" : "STILL","confidence" : 100} ]} ]}, {"timestampMs" : "1513510913776","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 15,"altitude" : -11,"verticalAccuracy" : 2,"activity" : [ {"timestampMs" : "1513507320258","activity" : [ {"type" : "TILTING","confidence" : 100} ]} ]}, {"timestampMs" : "1513510898735","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 16,"altitude" : -12,"verticalAccuracy" : 2}, {"timestampMs" : "1513510874140","latitudeE7" : 123456789,"longitudeE7" : -123456789,"accuracy" : 19,"altitude" : -12,"verticalAccuracy" : 2,"activity" : [ {"timestampMs" : "1513510874245","activity" : [ {"type" : "STILL","confidence" : 100} ]} ]} ]}
文件被 JSONLint 和 FreeFormatter 测试为有效。
最佳答案
Obvious choices ...
这里显而易见的选择是可以快速处理大文件的 JSON 感知工具。在下文中,我将使用 jq ,只要内存中有足够的 RAM 来保存文件,它就可以轻松快速地处理 GB 大小的文件,即使内存中没有足够的 RAM 来保存 JSON,它也可以处理非常大的文件。
首先,我们假设该文件由所示形式的 JSON 对象数组组成,目标是为每个可接受的子对象提取两个值。
这是一个可以完成这项工作的 jq 程序:
.[].activity[]
| .timestampMs as $ts
| .activity[]
| select(.type == "WALKING")
| [$ts, .confidence]
对于给定的输入,这将产生:
["1515564665992",3]
更具体地说,假设上述程序位于名为 program.jq 的文件中,并且输入文件为 input.json,则 jq 的合适调用如下:
jq -cf program.jq input.json
应该很容易修改上面给出的 jq 程序来处理其他情况,例如如果 JSON 模式比上面假设的更复杂。例如,如果架构中存在一些不规则性,请尝试添加一些后缀 ?
,例如:
.[].activity[]?
| .timestampMs as $ts
| .activity[]?
| select(.type? == "WALKING")
| [$ts, .confidence]
关于json - 正则表达式可以减少巨大的文件大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671715/