我有一个很大的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转换器不支持多层结构。谢谢!
答案 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 );
?>