Angular 2 - 从嵌套数组创建 CSV 文件
Posted
技术标签:
【中文标题】Angular 2 - 从嵌套数组创建 CSV 文件【英文标题】:Angular 2 - Creating a CSV file from nested Array 【发布时间】:2018-12-07 04:28:39 【问题描述】:我正在尝试从看起来像这样的嵌套数组中为 csv 文件创建一个对象 -
[
"Name":obj.name,
"Age": obj.age,
"Class":obj.class
]
我使用类似于 -
的代码生成了这个数组let obj = originalObj.map(studentObj =>
return
"Name":studentObj.name,
"Age":studentObj.age,
"class":studentObj.class
现在obj.class
是逗号分隔值的对象,即maths,biology,physics
。班级的数量不是固定的和动态的,我的意思是一个人可以有2个班级或3个或4个班级,或者根本没有班级。我要生成的 csv 应该是这样的 -
| Name | Age | Class | Class | Class |
|------|-----|-----------|-----------|------------|
| abc | 12 | | | |
| xyz | 18 | Computers | | |
| ijk | 20 | Astronomy | Geography | Science |
如何转换数组对象以生成可以生成上述 csv 的所需对象?除非绝对必要,否则我最好不要为此使用任何外部 npm 库。
我确实尝试过@Mr. 下面提供的示例代码。 Ratnadeep 如果类的数量是固定的,它工作得很好,但在我的情况下,第一条记录没有类,因此在转换为 csv
时根本不会为类生成键。需要帮助来解决这个挑战,我已经超出了我的能力范围。
【问题讨论】:
npmjs.com/package/xlsx 【参考方案1】:JSON 不包含同名的多个键。而不是我已经实施。使用原始对象中的示例数据实现,您可以根据需要对其进行修改。 姓名 |年龄 | 1 级 |二级 |第 3 类 ...
使用jsonexport
npm 包来创建 csv。
var myData = [
"Name":'John',
"Age": 28,
"Classes":"Maths,Biology,Physics"
]
for(var i=0;i<myData.length;i++)
var arrClass = myData[i].Classes.split (',');
delete myData[i].Classes
arrClass.forEach(function(ele,index)
var keyName = 'class'+(index+1);
myData[i][keyName]= ele;
);
jsonexport(myData,function(err, csv)
if(err) return console.log(err);
console.log(csv);
fs.writeFile('test.csv',csv,function(err)
console.log(err);
);
);
输出:
更新答案我不知道您是如何生成 csv 的。但我已经准备好了最终的myData
json 对象数组。类列本质上是动态的。
var myData = [
"Name":'abc',
"Age": 12
,
"Name": 'xyz',
"Age": 18,
"Classes": "Computers"
,
"Name": 'ijk',
"Age": 20,
"Classes": "Astronomy,Geography,Science"
]
for(var i=0;i<myData.length;i++)
if (myData[i].hasOwnProperty("Classes"))
var arrClass = myData[i].Classes.split(',');
delete myData[i].Classes;
arrClass.forEach(function (ele, index)
var keyName = 'class' + (index + 1);
myData[i][keyName] = ele;
);
jsonexport(myData,function(err, csv)
if(err) return console.log(err);
console.log(csv);
fs.writeFile('test.csv',csv,function(err)
console.log(err);
);
);
输出
【讨论】:
我已经更新了问题陈述,你可以看看吗? @jeet 我已经更新了我的答案,请通过它。谢谢【参考方案2】:预期结果不是有效的 CSV。您不能拥有三个具有相同名称的列。但是您可以将 obj.class 保留为 csv 字符串。一个幼稚且不完整的实现可能是:
function toCSV(items, separator=';')
if (!items.length) return '';
const columns = Object.keys(items[0]).join(separator);
const body = items.map(item =>
Object.values(item).join(separator)
).join('\n');
return columns + '\n' + body;
【讨论】:
我已经更新了问题陈述,你可以看看吗?以上是关于Angular 2 - 从嵌套数组创建 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式从 Angular 2 中的 json 创建嵌套组件