如果您只是将append: true 添加到您的createCsvWriter 调用参数中,它会有些工作,尽管CSV 记录的顺序取决于splashy.fromUrl 完成其工作的顺序。另外,由于您使用append 模式,因此您不会在输出的 CSV 中获得标头记录。
相反,您可以在 imgs 循环之外定义 csvWriter。
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());