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