Если вы просто добавите 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());