使用OpenRefine将CSV数据转换为嵌套的JSON

时间:2017-07-03 03:04:11

标签: json csv openrefine

所以我试图从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,那将非常感激。

1 个答案:

答案 0 :(得分:0)

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

首先在OpenRefine项目中使用'Edit Cells - > “站名”列上的“空白向下”菜单选项 然后转到导出并选择“模板” 在“前缀”部分中,只需添加[ 在行模板部分中输入:

    {{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逻辑