【问题标题】:Streaming large json file to csv将大型 json 文件流式传输到 csv
【发布时间】:2021-11-08 10:34:59
【问题描述】:

我有一个大的 JSON 文件,其中包含这样的对象列表:

{
   "_index":"pelias",
   "_type":"address",
   "_id":"jf808cdawi46z",
   "_score":1,
   "_source":{
      "center_point":{
         "lon":106.66307,
         "lat":10.959882
      },
      "name":{
         "default":"375/20 Bùi Quốc Khánh, Chánh Nghĩa, Bình Dương, Việt Nam"
      }
   }
}
{
   "_index":"pelias",
   "_type":"address",
   "_id":"jf808cdawi46z",
   "_score":1,
   "_source":{
      "center_point":{
         "lon":106.66307,
         "lat":10.959882
      },
      "name":{
         "default":"375/20 Bùi Quốc Khánh, Chánh Nghĩa, Bình Dương, Việt Nam"
      }
   }
}

我正在使用 jq 将其转换为这样的 csv:

"address","lat","lon"
"375/20 Bùi Quốc Khánh, Chánh Nghĩa, Bình Dương, Việt Nam",10.959882,106.66307
"375/20 Bùi Quốc Khánh, Chánh Nghĩa, Bình Dương, Việt Nam",10.959882,106.66307

我正在使用此代码:

cat pelias_minify.json | jq -r -s '. | [.[]  | {lat: ._source.center_point.lat, lon: ._source.center_point.lon, address: ._source.name.default}] | (map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' > pes.csv

问题在于该文件的大小已超过 2GB。我正在研究应用流,但仍然不明白如何使用它。请问有什么帮助吗?非常感谢。

更新,我尝试了这段代码,我可以流式传输文件输出:

cat pelias_minify.json | jq -cn --stream 'fromstream(0|truncate_stream(inputs)) | {lat: ._source.center_point.lat, lon: ._source.center_point.lon, address: ._source.name.default}'

输出:

{"center_point":{"lon":106.66307,"lat":10.959882},"name":{"default":"375/20 Bùi Quốc Khánh, Chánh Nghĩa, Bình Dương, Việt Nam"}}
{"center_point":{"lon":106.66307,"lat":10.959882},"name":{"default":"375/20 Bùi Quốc Khánh, Chánh Nghĩa, Bình Dương, Việt Nam"}}

【问题讨论】:

    标签: json stream jq


    【解决方案1】:

    由于输入文件只是一个 JSON 实体流,而且每个输出行似乎只依赖于其中一个,因此您可以通过不使用 -s 命令行选项并调整您的jq 程序相应地。应该不需要使用 --stream 选项。

    【讨论】:

      【解决方案2】:

      正如 peak 所暗示的,您的输出不需要调用 jq 的流解析器。如果您可以有效地单独过滤出 CSV 输出的必填字段,那么您应该没问题,即

      jq -r -cn '["address","lat","lon"], (inputs | [._source.name.default,._source.center_point.lat,._source.center_point.lon]) | @csv'
      

      【讨论】:

      • 非常感谢,有什么方法可以学习 jq 而不是手册文档?我发现它没有多大帮助。
      • jq Cookbook 有很多有用的示例 - github.com/stedolan/jq/wiki/Cookbook,以及常见问题解答 - github.com/stedolan/jq/wiki/FAQ
      • 嗨,我想做一个通用方法,这意味着我会将所有键和值转换为 csv。我正在尝试找到一种方法来展平对象。
      猜你喜欢
      • 1970-01-01
      • 2016-12-29
      • 2017-11-24
      • 2013-07-15
      • 2019-07-03
      • 2016-08-02
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多