【问题标题】:Compare Json to CSV File Headings and Populate将 Json 与 CSV 文件标题进行比较并填充
【发布时间】:2020-07-07 14:42:36
【问题描述】:

您好有以下 JSON,我想将其与 CSV 文件中的一组字段名称进行匹配并填充。我正在从 api 获取 json 数据,并想在 node.js 中动态创建设置的 CSV 文件

CSV 集字段名称:

"Name", "ID", "PRODUCT 1", "PRODUCT 2", "PRODUCT 3"

JSON(为简单起见手动示例,如果结构有错误,请致歉):

[{
   name: 'Bob',
   id: '100',
   products: {[
       {item: 'product 1',
       qty: '3'},
       {item: 'product 2',
       qty: '2'}]
},{
   name: 'James',
   id: '200',
     products: {[
       {item: 'product 3',
       qty: '1'}]
}

填充所需的 CSV:

CSV 字段:

"Name", "ID", "PRODUCT 1", "PRODUCT 2", "PRODUCT 3"
 Bob     100    3              2
 James   200                                1

【问题讨论】:

  • 产品的最大数量是否始终为 3,因此 CSV 列的最大数量为 5?或者是否存在未知的产品上限,您需要根据给定 API 响应中给定条目的最大产品数动态支持每个 CSV 的 n 列?
  • 谢谢你的回复,确实产品的最大数量是3,CSV列的最大数量是5。

标签: node.js json csv


【解决方案1】:

我会对 CSV 列进行整形和扁平化,然后使用 json2csvfs 解析和输出。

const { parse } = require('json2csv');
const fs = require('fs');

const items = [
  {
    name: 'Bob',
    id: '100',
    products: [
      {
        item: 'product 1',
        qty: '3'
      },
      {
        item: 'product 2',
        qty: '2'
      }]
  }, {
    name: 'James',
    id: '200',
    products: [
      {
        item: 'product 3',
        qty: '1'
      }]
  }
];
// flatten the needed CSV columns
const flatten = items.map(item => {
  const i = {
    name: item.name,
    id: item.id
  };
  // pull out products
  item.products.forEach(product => {
    i[product.item] = product.qty;
  });

  return i;
});

// Declare the expected fields here
const fields = ['name', 'id', 'product 1', 'product 2', 'product 3'];

const csv = parse(flatten, { fields });

fs.writeFile('items.csv', csv, (err) => {
  if (err) throw err;
  console.log('CSV file saved');
});

希望我有所帮助。

【讨论】:

  • 感谢 Mas 的回复,我会尝试,我想最初看这个,我可以看到如何展平,但我不确定如何将数量填充到正确的产品 CSV 列.但是,也许我需要更多地执行您的方法,它会变得清晰。谢谢。
  • @FrankFerdinandMcGovern 在flatten 中,forEach 将遍历项目的 products 数组,然后将新的键/值附加到新创建的对象 i,键将为 @987654327 @value 及其值将是 product.qty 值。如果您遇到任何其他困难,请告诉我。
  • 感谢 Mas 的指导,我现在要试试,结果会回来的。
  • 没问题,熟能生巧。 forEach 可用于遍历数组,并且在您的新 JSON 节点实际上是一个对象,我们实际上应该遍历边(而不是节点)。如:const flatten = items.map(item => { const { node } = item; const i = { name: node.name, createdAt: node.createdAt, }; node.lineItems.edges.forEach(product => { const n = product.node; i[n.name] = n.quantity; }); return i; });。还将答案标记为已接受,以便其他人可以找到它。干杯!
  • 哇,MAS,令人印象深刻,效果很好,我很幸运能找到这个问题,感谢您的帮助/专业知识 - 尊重。
猜你喜欢
  • 2016-10-18
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多