node中有json2csv
模塊捆等,但是當(dāng)json數(shù)據(jù)的key未事先指定乒验,并且有嵌套結(jié)構(gòu)的時(shí)候璃搜,嵌套在內(nèi)層的數(shù)據(jù)無(wú)法被識(shí)別并轉(zhuǎn)換。
參考一個(gè)在線的json to csv轉(zhuǎn)換工具Convert JSON to CSV该肴,及其源碼parse_object 和 csvkit
先對(duì)json數(shù)據(jù)進(jìn)行遞歸遍歷,將其拍平,然后再利用json2csv
模塊形真。
代碼如下:
var fs = require('fs');
var filename = 'data.txt';
function allItems(filename) {
console.log("read file", filename)
var contents = fs.readFileSync(filename).toString().split("\n")
var arr = []
contents.forEach(s => {
try {
arr.push(JSON.parse(s))
} catch (e) {
console.log("parse error", e)
console.log("parse error", s)
}
})
return arr
}
function parseObject(obj, 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 csv() {
var arr = allItems(filename);
var arrNew = [];
var json2csv = require('json2csv');
for(var i in arr) {
arrNew.push(parseObject(arr[i]));
}
try {
var result = json2csv({ data: arrNew });
fs.writeFile(filename+'.csv', result);
} catch (err) {
// Errors are thrown for bad options, or if the data is empty and no fields are provided.
// Be sure to provide fields if it is possible that your data array will be empty.
console.error("convert", err, err.stack);
}
}
csv()