将目录中的所有JSON文件合并为一个文件-Windows

时间:2018-09-28 02:11:29

标签: json windows jq

我是JSON的新手,我现在有一个列表,列出了约130个JSON文件,这些文件是通过下载我的Facebook消息数据收到的。我目前正在尝试使用JQ将它们全部连接到一个json文件中,同时保持现有消息顺序不变,但是当我尝试在Windows上输入命令时遇到了错误。我试图按照常见问题解答中针对Windows的建议进行操作,但仍然遇到问题。

所有文件都具有相同的布局

{
  "participants": [
    {
      "name": "Participant One"
    },
    {
      "name": "Participant Two"
    }
  ],
  "messages": [
    {
      "sender_name": "Participant One",
      "timestamp_ms": 99999999999,
      "content": "message content",
      "type": "Generic"
    },
    {
      "sender_name": "Participant Two",
      "timestamp_ms": 9999999999,
      "content": "message content",
      "type": "Generic"
    }
  ],
  "title": "chat title",
  "is_still_participant": true,
  "thread_type": "Regular",
  "thread_path": "thread path"
}

如果可以使用JQ,我想将“消息”仅合并到一个JSON文件中,同时保持其现有顺序。这些消息是我出于目的而在意的这些文件中唯一的数据。

-编辑- 非常抱歉,原始帖子中没有详细信息。我尝试了在这里和其他地方都找到的一些命令:

jq -s "[.[][]]" a-*.json > output.json

jq -s "{ attributes: map(.attributes[0]) }" file*.json > output.json

jq -s "*" *.json > output.json

我还尝试将这段代码放入文本文件中,并使用以下方法对其进行符文处理:     jq -f文件名 但是我也收到错误

我一直遇到的错误是:

jq: error: Could not open file *.json: Invalid argument

jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Windows cmd shell quoting issues?) at <top-level>

关于输出的更多细节,我试图实现:我正在使用JQ 1.5。我不关心JSON文件彼此添加的顺序,只要消息保持正确的顺序即可,这样我就可以获得清晰的已定义消息/响应对。我也不在乎是否将所有内容组合在一起,而我必须以其他方式将消息分开。与之类似的东西将是我的理想输出:

"messages": [
    {
      "sender_name": "Participant One",
      "timestamp_ms": 99999999999,
      "content": "message content",
      "type": "Generic"
    },
    {
      "sender_name": "Participant Two",
      "timestamp_ms": 9999999999,
      "content": "message content",
      "type": "Generic"
    },
    {
      "sender_name": "Participant Three",
      "timestamp_ms": 9999999999,
      "content": "message content",
      "type": "Generic"
    },
    {
      "sender_name": "Participant Two",
      "timestamp_ms": 9999999999,
      "content": "message content",
      "type": "Generic"
    }
  ]

参与者2代表我对消息的回复,其他参与者是我与之交谈的人(这是Facebook原始JSON输出中的样子)

1 个答案:

答案 0 :(得分:1)

您可以从以下命令行调用开始:

jq -n "[inputs | .messages] | add" *.json 

这有许多假设。如果您的Windows Shell不支持通配符扩展,请参见Passing multiple wildcard filenames to a command in Windows和/或https://superuser.com/questions/460598/is-there-any-way-to-get-the-windows-cmd-shell-to-expand-wildcard-paths/460648#460648

其他假设是您使用的是jq 1.5或更高版本,当然,当前目录中的所有* .json文件都是相关的,并且* .json按所需顺序列出了它们。

如果最好通过显式列出JSON文件来确定其顺序,那么您可能需要创建一个批处理文件。如果它们的排序是由它们的内容决定的,则可以使用jq来为它们排序,但是具体操作方法将取决于有关排序标准的细节。