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 创建嵌套组件

选择带有restangular或angular的嵌套数组元素

从嵌套 json 排序的 Angular 4 数据表

Angular 2 动态嵌套表单

从嵌套的 xml 创建一个数据框并生成一个 csv