var fs = require('fs');
var iconv = require('iconv-lite');
function parseObject(obj, path) {
console.log(type(path))
if (path == undefined)
path = "";
var type = obj.constructor;
var scalar = (type == Number || type == String || type == Boolean || type == null);
//如果是数组或者对象,要继续解
if (type == Array || type == Object) {
var d = {};
for (var i in obj) {
var newD = parseObject(obj[i], path + i + ".");
Object.assign(d, newD);
}
return d;
}
else if (scalar) {
var d = {};
var endPath = path.substr(0, path.length-1);
d[endPath] = obj;
return d;
}
else return {};
}
//获取表头
function getCsvHeader(obj)
{
let headerString = "";
for (var i in obj) {
headerString = headerString.concat(i, ",");
}
headerString = headerString.substr(0, headerString.length-1);
headerString = headerString.concat("\r\n");
return headerString;
}
//获取表数据
function getCsvRow(obj)
{
let rowString = "";
for (var i in obj) {
switch (obj[i].constructor)
{
//字符串转单元格时加双引号包起来,检查如果有半角逗号替换成全角(这一点已经可以不用了)
case String:
var re = /,/g;
let cellString = obj[i].replace(re, ",");
rowString = rowString.concat("\"", cellString, "\"", ",");
break;
default:
rowString = rowString.concat(obj[i].toString(), ",");
break;
}
}
rowString = rowString.substr(0, rowString.length-1);
rowString = rowString.concat("\r\n");
return rowString;
}
function convertOneFile(srcPath, desPath)
{
let content = fs.readFileSync(srcPath).toString();
let jsonObject = JSON.parse(content);
if (jsonObject instanceof Array && jsonObject.length > 0)
{
//从第一组数据中把字段名取出来
//let fields = getFields(jsonObject[0]);
let csvString = "";
for (var i = 0; i < jsonObject.length; i++)
{
let newOb = parseObject(jsonObject[i]);
if (i == 0)
{
csvString = csvString.concat(getCsvHeader(newOb));
}
csvString = csvString.concat(getCsvRow(newOb));
}
//console.log(csvString);
let data = iconv.encode(csvString, 'gbk');
fs.writeFileSync(desPath, data, 'buffer', function(err){
if (err != null)
{
console.error("error:", err);
console.error("parse error:" + srcPath);
}
});
//jsondata2csv(jsonObject);
}
else
{
console.warn("file error, please check! ", srcPath);
}
}
function json2excel(srcDir, files)
{
//let srcDir = "tables\\json\\";
let desDir = "tables\\csv\\"
let count = 0;
files.forEach(filename => {
let dotIndex = filename.indexOf(".json")
if (dotIndex > 0)
{
let desPath = desDir + filename.substr(0, dotIndex) + ".csv";
//console.log("desPath:" + desPath);
convertOneFile(srcDir + filename, desPath);
count++;
}
});
console.log("covnet complete, count:" + count);
}
function testFiles()
{
let srcDir = "tables\\json\\";
let files = ["dizidef.json"];
json2excel(srcDir, files);
}
function main(){
//var filename = 'jingjieleveldef.json';
let srcDir = "D:\\gameConfig\\策划\\目标产品配置\\Json";
let files = fs.readdirSync(srcDir);
json2excel(srcDir, files);
}
main()