Записать результат в CSV-файл в nodeJS - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь перебрать строку изображений url, затем получить 3 значения цвета rgb, которые делает splashy.js, а затем использовать csv-writer для отображения данных в файле csv, но, к сожалению, вместо добавления в файл csv-writer продолжает переписывать файл, а не добавлять в файл.Как это исправить?

enter image description here

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Это также может быть достигнуто без зависимости от любого стороннего модуля npm.Мы можем генерировать CSV-файлы, используя функции core node.js.

Для этого случая мне нужно понять, в каком формате вы ищете CSV-файл.

Можно создать базовый CSV-файл.как:

let headers = ["h1","h2","h3","h4"].join("\t");
let row1    = ["r1","r2","r3","r4"].join("\t");
let row2    = ["t1","t2","t3","t4"].join("\t");

let writeStream = headers+"\n"+row1+"\n"+row2+"\n";

let fs = require("fs");

fs.writeFile("file.csv", writeStream)
.then(file => {{file details}})
.catch(err => err)
0 голосов
/ 13 января 2019

Если вы просто добавите 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());
0 голосов
/ 11 декабря 2018

В первой строке csv-writer#createobjectcsvwriter принимает необязательный параметр, чтобы указать, что вы хотите добавить к файлу вместо его перезаписи.Вы можете найти подробности в описании пакета npm

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 }) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...