【问题标题】:Write result into csv file in nodeJS在nodeJS中将结果写入csv文件
【发布时间】:2018-12-11 05:00:50
【问题描述】:

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

【问题讨论】:

  • 请发布您的代码,而不是您的代码图片
  • 刚刚更新了帖子,抱歉
  • 您应该发布没有修复的代码;)

标签: javascript arrays node.js loops csv


【解决方案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 }) 

【讨论】:

  • 这是createObjectCsvWriter 函数的一个选项,你应该使用const createCsvWriter = require("csvwriter").createObjectCsvWriter({ append: true }) 之类的东西。我已经更新了我的答案。
  • 是的,谢谢你解决了这个问题,但我知道我得到了。 UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺
  • 很高兴它成功了。我建议您接受答案,并重新创建一个新问题,因为它不相关,并且在 cmets 中无法管理。谢谢。
  • 啊,我很抱歉,这是我第二次使用它确实知道 90 分钟的等待时间太累了,但是当计时器完成了,你的时间确实意味着粗鲁。
【解决方案2】:

如果您只是将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());

【讨论】:

    【解决方案3】:

    这也可以在不依赖任何 3rd 方 npm 模块的情况下实现。 我们可以使用 node.js 的核心功能生成 csv 文件。

    对于这种情况,我需要了解您在寻找 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)
    

    【讨论】:

      猜你喜欢
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      相关资源
      最近更新 更多