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