【问题标题】:Turning CSV data into nested JSON using OpenRefine使用 OpenRefine 将 CSV 数据转换为嵌套的 JSON
【发布时间】:2017-07-03 03:04:10
【问题描述】:

所以我试图从 csv 格式解析一些天气数据并将其转换为嵌套的 JSON 格式。我目前有一个大型 csv 文件,其中包含以下列:站 ID、月份,然后是 30 列数据(每天)。我在顶部有一个带有基本标题的标题。我正在尝试将其转换为 json 格式,其中 Station ID 是键名,其中的月份 1-12 是另一个键名,其中显示了 30 天中的每一天。我尝试了几个在线和可下载的 CSV 到 JSON,并花时间玩 OpenRefine,但无法弄清楚如何将 Station id 作为标题,然后嵌套月份,然后是几天。以下是供参考的 CSV 数据示例:Station Name,Month,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 AQW00061705,1,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,824C,825C,825C,825C,825C,825C,825C,825C,825C,825C,825C,826C,826C,826C
每个站 id 都有 12 个这样的列,这使得这个过程特别困难。如果有人有 OpenRefine 的经验,或者将这种类型的结构化数据转换为 JSON,将不胜感激。

【问题讨论】:

    标签: json csv openrefine


    【解决方案1】:

    因此在 OpenRefine 中为此编写导出模板有点痛苦,但可以做到。

    首先在 OpenRefine 项目中使用 Station Name 列上的“Edit Cells -> Blank Down”菜单选项 然后转到导出并选择“模板” 在“前缀”部分只需输入[ 在行模板部分放:

        {{if(row.record.fromRowIndex==row.index,if(row.record.fromRowIndex>0,",","")+"{\"Station Name\" :"+ jsonize(cells["Station Name"].value)+",","")}}
    {{jsonize(cells["Month"].value)}}:{
    {{forEach(row.columnNames[2,33],v,jsonize(v)+": "+jsonize(cells[v].value)+if(v!="31",",",""))}}
    }{{if(cells["Month"].value!="12",",","")}}
    {{if(row.index+1==row.record.toRowIndex,unescape("}","html"),"")}}
    

    将“行分隔符”部分留空 在“后缀”部分只需输入]

    这应该会为您提供有效的 JSON,例如:

        [
      {
        "Station Name": "AQW00061705",
        "1": {
          "1": "824C",
          "2": "824C",
          "3": "824C",
          "4": "824C",
          "5": "824C",
    

    等等

    第一个 '1' 是月份编号,随后的 "1": "824C" 等是日期和读数

    我必须在此处添加大量逻辑才能使其正常工作-理论上,我认为更简单的版本应该可以工作,但是我看到了一些导致无效 JSON 的奇怪行为-因此我已经完成了所有工作模板内的 GREL 中的逻辑

    【讨论】:

    • 哦 - 使用 unescape("}","html") 是因为模板机制不喜欢 GREL 语句中的闭合花括号(由于某种原因它被解释为模板的一部分 - 可能是一个错误)。为避免这种情况,我对} 使用html 编码,然后将其取消转义以将大括号留在输出中
    • 非常感谢您!最初我的一些空白单元格被输出为 null(使 json 无效),但在快速转换单元格后,用空格字符替换它们现在一切正常。没有那个我是不可能做到的,所以再次感谢你:)
    • 太棒了乔希。如果您有时间接受我的回答,那就太好了。
    • 其实还有一个问题。我试图对另一个非常相似的文件做同样的事情,除了每天每小时的数据之外,everything 相同,添加了一个额外的列。除了现在,这似乎并不困难,而不是在该月的最后几天没有出现空白/空值,这些现在的行只是被遗漏了。数据现在的结构类似于“站名月份第 1 天” 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24'。更改 [2,33] 和 '31' 似乎微不足道,但是您建议如何处理这个额外的变量?[感谢您的帮助]
    • 当您添加到层次结构中时,这肯定会变得更加复杂。要使它适用于您在这里拥有的额外层次结构,可能意味着重新考虑逻辑。如果您首先将 Station Name 和 Month 都空白,那么您可以修改代码以仅在这些元素存在时包含这些元素 - 您遇到的问题是正确关闭这些元素 - 在上面的代码中,我通过检查我们位于“记录”的最后一行 - 仅适用于站名列 - 您需要以不同的方式检查月末。
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    相关资源
    最近更新 更多