技术求助:合并两个Laptime JSON文件,去重SteamID并保留指定结构
解决圈速数据JSON文件合并问题(去重SteamID并保留指定结构)
看起来你之前用reduce . as $item ({}; . * $item)的问题在于,这个命令是直接合并顶层对象,会让第二个文件的loggedTimes完全覆盖第一个的,而不是递归合并里面的SteamID和车辆圈速数据。我给你写一个针对性的jq脚本,完美满足你的需求:合并两个文件的loggedTimes,去重SteamID,同时合并同一车辆下的所有圈速记录,完全保留你需要的结构。
最终JQ合并命令
jq -s ' reduce .[] as $item ( { loggedTimes: { steamids: {}, vehicles: {} } }; # 合并SteamID,重复ID会被后处理的文件覆盖(可调整) .loggedTimes.steamids += $item.loggedTimes.steamids | # 递归合并车辆及对应的圈速记录 .loggedTimes.vehicles |= reduce ($item.loggedTimes.vehicles | to_entries[]) as $vehicle ( .; .[$vehicle.key] = (.[$vehicle.key] // {}) * $vehicle.value ) ) ' laptimes_data_ams.json laptimes_data_kow.json > merged_laptimes.json
命令详解
-s选项:把两个输入文件读取成一个JSON数组,第一个元素是laptimes_data_ams.json的内容,第二个是laptimes_data_kow.json的内容。- 外层reduce:遍历两个输入文件,初始化一个空的目标结构(包含空的
steamids和vehicles)。 - SteamID合并:
+=操作符会合并两个SteamID对象,如果存在重复的SteamID,后面文件中的名称会覆盖前面的。如果你想保留第一个文件的SteamID名称,把这行改成:
因为jq的.loggedTimes.steamids = $item.loggedTimes.steamids + .loggedTimes.steamids+对对象是左优先,左边的键不会被右边的覆盖。 - 车辆及圈速合并:
- 先把当前文件的
vehicles转成键值对数组(to_entries[]),遍历每一辆车。 - 对于每个车辆ID,如果目标结构中已经存在,就用
*递归合并(这样同一车辆下的laptimes会合并,不会覆盖);如果不存在,就用// {}创建一个空对象再合并,确保不会出现null值。
- 先把当前文件的
测试示例
假设第一个文件内容:
{ "loggedTimes": { "steamids": { "123": "Alice", "456": "Bob" }, "vehicles": { "car001": { "laptimes": { "123": { "lapTime": 120.5, "logtime": "2024-01-01", "name": "Alice", "rank": 1, "refId": "ref1", "vehicleid": "car001", "wet": 0 } } } } } }
第二个文件内容:
{ "loggedTimes": { "steamids": { "456": "Robert", "789": "Charlie" }, "vehicles": { "car001": { "laptimes": { "456": { "lapTime": 118.2, "logtime": "2024-01-02", "name": "Robert", "rank": 1, "refId": "ref2", "vehicleid": "car001", "wet": 0 } } }, "car002": { "laptimes": { "789": { "lapTime": 130.1, "logtime": "2024-01-03", "name": "Charlie", "rank": 1, "refId": "ref3", "vehicleid": "car002", "wet": 0 } } } } } }
合并后的输出会完全符合你要的结构:
{ "loggedTimes": { "steamids": { "123": "Alice", "456": "Robert", "789": "Charlie" }, "vehicles": { "car001": { "laptimes": { "123": { "lapTime": 120.5, "logtime": "2024-01-01", "name": "Alice", "rank": 1, "refId": "ref1", "vehicleid": "car001", "wet": 0 }, "456": { "lapTime": 118.2, "logtime": "2024-01-02", "name": "Robert", "rank": 1, "refId": "ref2", "vehicleid": "car001", "wet": 0 } } }, "car002": { "laptimes": { "789": { "lapTime": 130.1, "logtime": "2024-01-03", "name": "Charlie", "rank": 1, "refId": "ref3", "vehicleid": "car002", "wet": 0 } } } } } }
内容的提问来源于stack exchange,提问作者Shriukan
相关产品推荐
相关产品推荐

