将换行符分隔的 JSON 文件中的类型从字符串转换为整数,处理 null

将换行符分隔的 JSON 文件中的类型从字符串转换为整数,处理 null

我们有以下换行符分隔的 JSON:

{"leagueId": "1", "name": "the ballers"}
{"team": "2", "leagueId": "1", "name": "the hoopers"}
{"team": "3", "leagueId": "1", "name": "the gamerrs"}
{"team": "4", "leagueId": "1", "name": "the drivers"}
{"team": "5", "leagueId": "1", "name": "the jumpers"}
{"team": "6", "leagueId": "1", "name": "the riserss"}

球队、联赛 ID都应该是整数,我们想修改这个 NDJSON 将这些字符串转换为整数。我们想要的输出是:

{"leagueId": 1, "name": "the ballers"}
{"team": 2, "leagueId": 1, "name": "the hoopers"}
{"team": 3, "leagueId": 1, "name": "the gamerrs"}
{"team": 4, "leagueId": 1, "name": "the drivers"}
{"team": 5, "leagueId": 1, "name": "the jumpers"}
{"team": 6, "leagueId": 1, "name": "the riserss"}

假设我们知道/有一个需要从字符串转换为整数 [team, leagueId] 的列的列表/数组,我们如何进行此转换?这是否可以通过(a)使用诸如 之类的工具的 bash 命令实现jq,或者(b)是否有一些 python 解决方案?我们的完整 NDJSON 大小约为 10GB,性能非常重要,因为这是我们日常数据摄取管道中的一个步骤。

编辑: jq -c '{leagueId: .leagueId | tonumber, team: .team | tonumber, name: .name}' tmp/testNDJSON.json > tmp/new_output.json看起来是这样的这个会如果不是第一个 JSON 中缺少team值,则可以工作...感谢任何帮助!

答案1

jq  -c '.leagueId |= tonumber | (.team // empty) |= tonumber' file

这会将leagueId每个对象中的 转换为数字,然后转换该team值(如果存在且非空)。

概括为将一组键转换为数字(如果存在):

jq -c --argjson keys '["team", "leagueId"]' \
    '($keys[] as $key | .[$key] // empty) |= tonumber' file

使用jo创建该列表:

jq -c --argjson keys "$(jo -a team leagueId)"  \
    '($keys[] as $key | .[$key] // empty) |= tonumber' file

这里发生的情况是,该语句.[$key] // empty用于一组$key字符串,从对象生成值,其中$key是具有非空值的现有键。然后这些值被转换为数字。字符串$key是从命令行传入的数组中获取的。

相关内容