Angular 2 - 从嵌套数组创建 CSV 文件
Angular 2 - Creating a CSV file from nested Array
我正在尝试从看起来像这样的嵌套数组为 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
。 classes 的数量不是固定的和动态的,我的意思是一个人可以有 2 个 classes 或 3 个或 4 个,或者根本没有 class。我要生成的 csv 应该看起来像这样 -
| Name | Age | Class | Class | Class |
|------|-----|-----------|-----------|------------|
| abc | 12 | | | |
| xyz | 18 | Computers | | |
| ijk | 20 | Astronomy | Geography | Science |
如何转换数组对象以生成可以生成上述 csv 的所需对象?除非绝对必要,否则我最好不要为此使用任何外部 npm 库。
我确实尝试了@Mr 下面提供的示例代码。 Ratnadeep,如果 classes 的数量是固定的,它会很好地工作,但在我的例子中,第一条记录没有 class 因此在转换为 csv
键时不会生成class 根本没有。需要帮助来解决这个挑战,我力不从心。
预期结果不是有效的 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;
}
JSON 不包含同名的多个键。相反,我已经实施了。使用原始对象中的示例数据实现,您可以根据需要对其进行修改。
姓名 |年龄 |类1 |类2 |第 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 的。但是我已经准备好了 json 个对象的最终 myData
数组。 类 列本质上是动态的。
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);
});
});
输出
我正在尝试从看起来像这样的嵌套数组为 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
。 classes 的数量不是固定的和动态的,我的意思是一个人可以有 2 个 classes 或 3 个或 4 个,或者根本没有 class。我要生成的 csv 应该看起来像这样 -
| Name | Age | Class | Class | Class |
|------|-----|-----------|-----------|------------|
| abc | 12 | | | |
| xyz | 18 | Computers | | |
| ijk | 20 | Astronomy | Geography | Science |
如何转换数组对象以生成可以生成上述 csv 的所需对象?除非绝对必要,否则我最好不要为此使用任何外部 npm 库。
我确实尝试了@Mr 下面提供的示例代码。 Ratnadeep,如果 classes 的数量是固定的,它会很好地工作,但在我的例子中,第一条记录没有 class 因此在转换为 csv
键时不会生成class 根本没有。需要帮助来解决这个挑战,我力不从心。
预期结果不是有效的 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;
}
JSON 不包含同名的多个键。相反,我已经实施了。使用原始对象中的示例数据实现,您可以根据需要对其进行修改。 姓名 |年龄 |类1 |类2 |第 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 的。但是我已经准备好了 json 个对象的最终 myData
数组。 类 列本质上是动态的。
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);
});
});
输出