【问题标题】:Ruby: nesting of 100 is too deep (JSON::NestingError) while converting CSV to JSONRuby:将 CSV 转换为 JSON 时 100 的嵌套太深 (JSON::NestingError)
【发布时间】:2015-01-27 16:59:37
【问题描述】:

我读过python question similar to my problem,但没有帮助。

我有一个 50 万行的 CSV 文件,如下所示:

contract-number,amendment-number,award-date,contract-value,supplier-name,contracting-entity
W8486,0,2014-04-14,14326000,"COMPANY A","Office of Llama Supplies"
W8487,0,2014-04-10,150000,"COMPANY B","Foo Bar Dept"
W8488,2,2014-03-24,146000,"COMPANY C","Armed Forces"
W8488,1,2014-03-03,68000,"COMPANY C","Armed Forces"
W8488,0,2014-02-17,27760,"COMPANY C","Armed Forces"
W8489,0,2014-02-14,51000000,"COMPANY B","Dept of Magical Affairs"

许多合同不止一次出现。 我想编写一个 Ruby 脚本来将我的数据转换为 JSON 文件,这些文件嵌套在同一个节点中,这些合约具有相同的编号,如下所示:

[{"W8486":
  {0:
    {
      "award-date": 2014-04-14,
      "contract-value": 14326000,
      "supplier-name": "COMPANY A",
      "contracting-entity": "Office of Llama Supplies"
    }
  }
},
{"W8487":
  {0:
    {
      "award-date": 2014-04-10,
      "contract-value": 150000,
      "supplier-name": "COMPANY B",
      "contracting-entity": "Foo Bar Dept"
    }
  }
},
{"W8488":
  {2:
    {
      "award-date": 2014-03-24,
      "contract-value": 146000,
      "supplier-name": "COMPANY C",
      "contracting-entity": "Armed Forces"
    }
  },
  {1:
    {
      "award-date": 2014-03-03,
      "contract-value": 68000,
      "supplier-name": "COMPANY C",
      "contracting-entity": "Armed Forces"
    }
  },
  {0:
    {
      "award-date": 2014-02-17,
      "contract-value": 27760,
      "supplier-name": "COMPANY C",
      "contracting-entity": "Armed Forces"
    }
  },
},
{"W8489":
  {0:
    {
      "award-date": 2014-02-14,
      "contract-value": 51000000,
      "supplier-name": "COMPANY B",
      "contracting-entity": "Dept of Magical Affairs"
    }
  }
}]

到目前为止,我已经成功地遍历了CSV using CSV.foreach do |line|,将每个项目都放入了一个哈希中。我设法检查了line[0] == previousContractNumber

但是每次我写我的 JSON 文件时,我都会收到这个错误:

nesting of 100 is too deep (JSON::NestingError)

我该如何解决这个问题?

非常感谢!

【问题讨论】:

  • 您构建输出的方式可能存在错误。如果你能展示你的代码会有所帮助。
  • 可能会有重大的可扩展性问题等着您。 CSV 是逐行读取的,具有很强的可扩展性。通常 JSON 被读取为单个字符串,然后将其解析为单独的对象并进行处理。将 500K 行转换为 500K 对象可能会消耗大量内存并在内存分配、移动和可能分页时减慢脚本速度。那里有类似 SAX 的 JSON 解析器,所以希望您使用一个来处理传入的 JSON 流。
  • 非常感谢大家! @Uri Agassi 的解决方案奏效了。您的帮助将极大地帮助我清理这些数据!最后,我有 262K 条记录,其中 128K 条与另一个共享一个合同号。运行脚本并编写 JSON 文件耗时 73 秒。

标签: ruby json csv


【解决方案1】:

这是一些应该工作的代码:

result = Hash.new { |h, k| h[k] = {} }
CSV.foreach do |line|
  result[line[0]][line[1]] = {
          "award-date" => line[2],
          "contract-value" => line[3],
          "supplier-name" => line[4],
          "contracting-entity" => line[5]
  }
end

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2018-01-07
    • 2020-10-28
    • 2020-02-21
    • 2020-04-02
    • 2018-10-27
    • 2021-05-17
    相关资源
    最近更新 更多