json - 正则表达式可以减少巨大的文件大小?

标签 json regex vba extract large-data

我有一系列巨大 (40-80mb) 导出的 Google 位置历史 JSON 文件,我的任务是使用这些文件分析选定的事件数据。不幸的是,Google 在他们的 download site 中没有参数或选项来选择除“一个包含forever 的巨型 JSON 之外的任何内容。” (KML 选项是两倍大。)

JSON-Converter (laexcel-test incarnation of VBA-JSON) 这样的明显选择;用VBA逐行解析;甚至 Notepad++ 。它们都崩溃并燃烧。我认为 RegEx 可能就是答案。

  1. This Python script 可以在两秒内从一个 40mb 的文件中提取时间戳和位置(使用 RegEx?)。 Python 是如何做到这么快的?(在 VBA 中会一样快吗?)

  2. 如果我有一个神奇的 RegEx block ,我就可以一点一点地提取我需要的所有东西,也许是这样的逻辑:

    • 删除所有内容 除了:
      timestampMsWALKING 出现在*同一组 [方括号] 之间时:

      • 我需要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} ]} ]} ]}

文件被 JSONLintFreeFormatter 测试为有效。

最佳答案

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/

相关文章:

javascript - 将查找和替换限制为整个单词 google sheets .gs 函数

python - 如何在 Python 2.7 中从文件中读取字典?

json - 如何在flutter中的模型类中存储复杂的json数据

javascript - 使用javascript从字符串中删除 "Form"标签及其内容

c++ - 使用标准正则表达式标记逗号分隔列表

excel - 无法单击 ActiveX 控件和表单控件 Excel 2010

c# - 使用 'WlanScan' 刷新 WiFi 网络列表(将 api 语法从 c# 转换为 vba...或解决方法?)

html - 在Excel中打开时强制html excel文件的宽度为一定宽度

javascript - 查找键值的对象键并将其转换为 moment.utc()?

java - JSONObject 使用单例