使用json2csv将大数组对象转换为csv



我需要转换一个JSON大数组(可以有超过10万个位置)转换成CSV。这个数组是直接在应用程序中创建的,它不是上传文件的结果。
看文档,我想过使用解析器,但它说:
For that reason is rarely a good reason to use it until your data is very small or your application doesn't do anything else.
因为数据并不小,我的应用程序会做其他的事情,而不是创建csv,我不认为这将是最好的方法,但我可能会误解文档。
是否可以使用其他选项(异步解析器或转换)与已经创建的数据(而不是数据流)?

供参考:这是一个嵌套应用程序,但我正在使用这个node.js库。
:我试着插入一个有超过300k个位置的数组,它进行得很顺利。

为什么需要任何外部模块?使用本地JSON.parse()函数将JSON转换为javascript对象数组是小菜一碟。

let jsontxt=await fs.readFile('mythings.json','uft8');
let mythings = JSON.parse(jsontxt);
if (!Array.isArray(mythings)) throw "Oooops, stranger things happen!"

然后,将javascript数组转换为CSV非常简单。最明显和最荒谬的情况是将数组的每个元素映射到一个字符串,该字符串是对象元素的JSON表示形式。最终得到的是一个无用的CSV,其中只有一个列,其中包含原始数组的每个元素。然后将结果字符串数组连接成单个字符串,用换行符n分隔。它没什么用,但是,见鬼,它是一个CSV!

let csvtxt = mythings.map(JSON.stringify).join("n");
await fs.writeFile("mythings.csv",csvtxt,"utf8");
现在,你可以感觉到你几乎到了。将无用的映射函数替换为您自己的
let csvtxt = mythings.map(mapElementToColumns).join("n");

,并在数组对象的字段和csv的列之间选择一个良好的映射。

function mapElementToColumns(element) {
return `${JSON.stringify(element.id)},${JSON.stringify(element.name)},${JSON.stringify(element.value)}`;
}

或者更彻底的

function mapElementToColumns(fieldNames) {
return function (element) {
let fields = fieldnames.map(n => element[n] ? JSON.stringify(element[n]) : '""');
return fields.join(',');
}
}

你可以在你的地图中调用

mythings.map(mapElementToColumns(["id","name","element"])).join("n");

最后,您可能会决定为"所有对象中的所有字段"使用一个自动语句。方法;它要求原始数组中的所有对象保持类似的字段模式。

提取数组第一个对象的所有字段,并将它们用作csv的标题行,作为提取其余元素的模板。

let fieldnames = Object.keys(mythings[0]);

,然后使用这个字段名数组作为映射函数

的参数
let csvtxt= mythings.map(mapElementToColumns(fieldnames)).join("n");

,以及将它们作为CSV头

的前缀。
csvtxt.unshift(fieldnames.join(','))

把所有的碎片放在一起…

function mapElementToColumns(fieldNames) {
return function (element) {
let fields = fieldnames.map(n => element[n] ? JSON.stringify(element[n]) : '""');
return fields.join(',');
}
}
let jsontxt=await fs.readFile('mythings.json','uft8');
let mythings = JSON.parse(jsontxt);
if (!Array.isArray(mythings)) throw "Oooops, stranger things happen!";
let fieldnames = Object.keys(mythings[0]);
let csvtxt= mythings.map(mapElementToColumns(fieldnames)).join("n");
csvtxt.unshift(fieldnames.join(','));
await fs.writeFile("mythings.csv",csvtxt,"utf8");

就是这样。很整洁,是吧?

相关内容

  • 没有找到相关文章

最新更新