【问题标题】:Pandas Dataframe to JSON: returns a single line for 1 million recordsPandas Dataframe 到 JSON:为 100 万条记录返回一行
【发布时间】:2020-10-18 00:59:02
【问题描述】:

我需要对我的 JSON 数据进行一些处理,但事实证明我的 JSON 的格式设置为只包含一行。在终端上,wc -l file.json 正在返回 0

创建文件将 Pandas Dataframe 转换为 JSON。

这里是示例:file.json

[
{"id":683156,"overall_rating":5.0,"hotel_id":220216,"hotel_name":"Beacon Hill Hotel","title":"\u201cgreat hotel, great location\u201d","text":"The rooms here are not palatial","author_id":"C0F"},
{"id":692745,"overall_rating":5.0,"hotel_id":113317,"hotel_name":"Casablanca Hotel Times Square","title":"\u201cabsolutely delightful\u201d","text":"I travelled from Spain...","author_id":"8C1"}
]

【问题讨论】:

  • 您的样本超过 1 行
  • 您对上述问题的jq 要求是什么?似乎不清楚
  • 如果我运行 wc -l file.json 它返回 0。它应该告诉我有一百万行。为什么我需要行数?因为我的数据很大。我想将它拆分为每个文件 10,000 条记录。我可以使用 Unix Split 命令拆分文件。为了将数据提供给 Split,我的数据应该有多行。 @ΔO'deltazero'
  • @Inian 这是我的问题:stackoverflow.com/q/62609271/2533173

标签: json data-science jq data-analysis data-cleaning


【解决方案1】:

我想将它拆分为每个文件 10,000 条记录。

您可以使用 jq 发出数组中的顶级项目,每行一个,如下所示:

jq -c '.[]' file.json

如果你只是想对这个流进行分区(而不是将每个分区重新组成一个数组),你可以使用split之类的工具。

如果您希望每个分区都是一个数组,您可以使用 jq 来形成分区,然后使用诸如awk 之类的工具来创建单独的文件。例如,请参阅此 SO Q&A: Splitting / chunking JSON files with JQ in Bash or Fish shell?

【讨论】:

    【解决方案2】:

    这里还有一个替代(建议的)解决方案,使用jtc 工具。

    1. 如果您的记录不包含任何嵌套对象/数组(如所示示例),那么实现它的简单方法是:
    bash $ <file.json jtc -t0c
    [
    { "author_id": "C0F", "hotel_id": 220216, "hotel_name": "Beacon Hill Hotel", "id": 683156, "overall_rating": 5.0, "text": "The rooms here are not palatial", "title": "\u201cgreat hotel, great location\u201d" },
    { "author_id": "8C1", "hotel_id": 113317, "hotel_name": "Casablanca Hotel Times Square", "id": 692745, "overall_rating": 5.0, "text": "I travelled from Spain...", "title": "\u201cabsolutely delightful\u201d" }
    ]
    bash $ 
    
    1. 否则(如果他们这样做),那么使用sed 对输出进行后处理的更复杂的解决方案是这样的:
    bash $ <file.json jtc -rw[:-1] -T'">{{}}<,"' -w[-1:] -TT -qq | sed '1s/^/[\
    /; $s/$/\
    ]/'
    [
    { "author_id": "C0F", "hotel_id": 220216, "hotel_name": "Beacon Hill Hotel", "id": 683156, "overall_rating": 5.0, "text": "The rooms here are not palatial", "title": "\u201cgreat hotel, great location\u201d" },
    { "author_id": "8C1", "hotel_id": 113317, "hotel_name": "Casablanca Hotel Times Square", "id": 692745, "overall_rating": 5.0, "text": "I travelled from Spain...", "title": "\u201cabsolutely delightful\u201d" }
    ]
    bash $ 
    
    1. 要在每一行显示每条记录,然后是这样的(但不确定是否是您所追求的):
    bash $ <file.json jtc -rw[:] 
    { "author_id": "C0F", "hotel_id": 220216, "hotel_name": "Beacon Hill Hotel", "id": 683156, "overall_rating": 5.0, "text": "The rooms here are not palatial", "title": "\u201cgreat hotel, great location\u201d" }
    { "author_id": "8C1", "hotel_id": 113317, "hotel_name": "Casablanca Hotel Times Square", "id": 692745, "overall_rating": 5.0, "text": "I travelled from Spain...", "title": "\u201cabsolutely delightful\u201d" }
    bash $ 
    

    PS。我是jtc 工具的创建者。 SO 规则要求免责声明。

    【讨论】:

      【解决方案3】:

      JSON 不需要任何空格,存储长 JSON 数据而不需要单个换行符是完全可以的(因此wc -l 给出0)。

      如果您想在 shell 界面中“漂亮地打印”您的 JSON,请使用jq 之类的工具。

      cat example.json
      > [{"id":683156,"hotel_id":220216,"hotel_name":"Beacon Hill Hotel"},{"id":692745,"hotel_id":113317,"hotel_name":"Casablanca Hotel Times Square"}]
      
      cat example.json | jq
      > [
      >   {
      >     "id": 683156,
      >     "hotel_id": 220216,
      >     "hotel_name": "Beacon Hill Hotel"
      >   },
      >   {
      >     "id": 692745,
      >     "hotel_id": 113317,
      >     "hotel_name": "Casablanca Hotel Times Square"
      >   }
      > ]
      

      要报告数组的长度,请使用jq length

      cat example.json | jq length
      > 2
      

      【讨论】:

      • 此解决方案不会为每条记录创建一行,而是此解决方案为“id”创建单独的行,为“hotel_id”创建另一行,为“hotel_name”创建另一行。
      • 这应该显示整个对象的 1 行:{ > "id": 683156, > "hotel_id": 220216, > "hotel_name": "Beacon Hill Hotel" > }
      • 我认为每 1 个文件行有 1 个数组项(尤其是当该项是结构化对象时)在 JSON 中没有任何意义
      • 对...好吧,我的实际问题是这个,你能看看吗? stackoverflow.com/q/62609271/2533173
      • 查看我的答案,使用jq 拆分数组。
      猜你喜欢
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2017-12-23
      • 2020-01-24
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      相关资源
      最近更新 更多