将结果写入nodeJS中的csv文件

时间:2018-12-11 05:00:51

标签: javascript arrays node.js loops csv

我正在尝试遍历一串url图像,然后抓取splashy.js所做的3种rgb值颜色,然后使用csv-writer在csv文件中显示数据,但不幸的是,没有添加到csv文件中-writer会不断重写文件,而不是添加到文件中。该如何解决?

enter image description here

2 个答案:

答案 0 :(得分:1)

在第一行,csv-writer#createobjectcsvwriter接受一个可选参数,以指定要附加到文件而不是覆盖文件。您可以在npm package description

上找到详细信息
  

createObjectCsvWriter(params)参数:

params <Object>
   - append <boolean> (optional)
     Default: false. When true, it will append CSV records to the specified file. If the file doesn't exist, it will create one.

您的行应显示为:

const createCsvWriter = require("csvwriter").createObjectCsvWriter({ append: true }) 

答案 1 :(得分:0)

如果仅将append: true添加到您的createCsvWriter调用参数中,虽然CSV记录的顺序取决于splashy.fromUrl完成其工作的顺序,但它会有些用。另外,由于您使用append模式,因此不会在输出CSV中获得标题记录。

相反,您可以在csvWriter循环之外定义imgs

const csvWriter = createCsvWriter({
  path: "./data/output.csv",
  header: [
    { id: "url", title: "URl" },
    { id: "color1", title: "Color" },
    { id: "color2", title: "Color" },
    { id: "color3", title: "Color" }
  ]
});

const promiseForRecords = imgs.map(async img => {
  const colors = await splashy.fromUrl(img.toString());
  return {
    url: img,
    color1: colors[0],
    color2: colors[1],
    color3: colors[2]
  };
});

Promise.all(promiseForRecords)
  .then(records => csvWriter.writeRecords(records))

这样,记录顺序将得到保证,并且您将在第一行中获得标题记录。

在此处使用csv-writer库的优点是,您不必担心任何图像URL是否包含逗号,或双引号"都需要在CSV中进行转义

如果您想逐行编写CSV,可以使用.reduce代替.map,如下所示:

imgs.reduce(async (promise, img) => {
  await promise;

  const colors = await splashy.fromUrl(img.toString());
  const records = [
    {
      url: img,
      color1: colors[0],
      color2: colors[1],
      color3: colors[2]
    }
  ];
  return csvWriter.writeRecords(records);
}, Promise.resolve());