将csv树结构转换为json

时间:2014-07-02 21:10:21

标签: json excel csv tree

我有一个很大的excel文档(2000多行),它使用单元格来指定树结构,我想将其解析为.json文件。 excel导出的.csv文档的格式如下,在excel文件中,逗号将是一个空单元格:

  

Layer1category1 ,,,,,

     

,Layer2category ,,,,

     

...

     

,,,, Layer5category1,

     

,,,,, ITEM1

     

,,,,, ITEM2

     

,,,, Layer5category2,

     

,,,,, ITEM1

     

,,, Layer4category2 ,,

     

...

     

Layer1category2 ,,,,,

     

...

     

Layer1category8 ,,,,, //这是最上层的最后一个类别

总之,Layer n 类别以 n-1 逗号开头,后跟 6-n 逗号,行前面加5逗号是最后一层,它的格式为字符串,并且除了名称之外还有许多字段。

我希望将其转换为类似于以下内容的.json文件。我使用“名称”,因为除了名称之外,每个字段还与很多需要进入json文件的统计信息绑定。

{"name" : "Layer1category1",
 "children": [
    {"name" : "Layer2category1",
     "children" : [
        {"name" : "Layer3category1"
         "children" : [ 
            ...
                    {"name" : "Layer5category1",
                     "children" : [{"name" : "item1"}, {"name" : "item2"}],}
                    {"name" : "Layer5category2",
                     "children" : [{"name" : "item1"}],}
                {"name" : "Layer4category2",
                 "children" : [
                ...
                ]}
"name" : "Layer1category2",
"children" : [ ... ]
}

有没有人对我如何处理此事有任何建议?我发现的csv到json转换器不支持多层结构。谢谢!

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并编写了简单的PHP脚本:

输入

Level I,Level II,Level III,Level IV,Level V,Level VI,Level VII,Level VIII,,,,,,,,,,,,,,,,,,
Role Profile,,,,,,,,,,,,,,,,,,,,,,,,,
,Development,,,,,,,,,,,,,,,,,,,,,,,,
,,Security,,,,,,,,,,,,,,,,,,,,,,,
,,Cloud,,,,,,,,,,,,,,,,,,,,,,,
,,,Cloud technologies,,,,,,,,,,,,,,,,,,,,,,
,,,,IaaS,,,,,,,,,,,,,,,,,,,,,
,,,,,Amazon Web Service (AWS),,,,,,,,,,,,,,,,,,,,
,,,,,Microsoft Azure,,,,,,,,,,,,,,,,,,,,
,,,,,Google Compute Engine (GCE),,,,,,,,,,,,,,,,,,,,
,,,,,OpenStack,,,,,,,,,,,,,,,,,,,,

输出

{
 "Role Profile":{
  "Development":{
   "Security":{},
   "Cloud":{
    "Cloud technologies":{
     "IaaS":{
      "Amazon Web Service (AWS)":{},
      "Microsoft Azure":{},
      "Google Compute Engine (GCE)":{},
      "OpenStack":{}
     }
    }
   }
  }
 }
}

代码

<?php
$fn = "skills.csv"; // input file name
$hasHeader = true; // input file has header, we will skip first line
//
function appendItem( &$r, $lvl, $item ) {
    if ( $lvl ) {
        $lvl--;
        end( $r ); 
        appendItem( $r[key($r)], $lvl, $item );
    } else {
        $r[$item] = array(); 
    }
}

$r = array();
if ( ( $handle = fopen( $fn, "r" ) ) !== FALSE ) {
    $header = true;
    while ( ( $data = fgetcsv( $handle, 1000, "," ) ) !== FALSE ) {
        if ( $header and $hasHeader ) {
            $header = false;
        } else {
            $lvl = 0;
            foreach( $data as $dv ) {
                $v = trim( $dv );
                if ( $v ) {
                    appendItem( $r, $lvl, $v );
                    break;
                }
                $lvl++;
            }
        }
    }
}
echo json_encode( $r );
?>