【问题标题】:Remove a line of a csv or ignore it删除一行csv或忽略它
【发布时间】:2018-07-23 09:11:51
【问题描述】:

我正在使用 fast-csv 读取 csv 文件,但我的文件格式与 fast-csv 的预期不完全一致:

First line with some details (not important)
Second line with header
Third line with data
Fourth line with data
...

我是怎么读的:

const csv = require('fast-csv');
const stream = fs.createReadStream('myfile.csv');
const csvStream = csv
    .fromStream(stream,
        {
            headers: true,
            delimiter: ',',
            rowDelimiter: '\n',
            quoteHeaders: false,
            quoteColumns: false
        })
    .on("data", data => {
       // i do something with datas

    })
    .on("error", error => {
        console.log("CSV is invalid !", error);
    })
    .on("end", data => {
        console.log("End of parsing");
        console.log(data);
    });

这里的问题是

标题:真,

将查找第一行作为标题,这就是我要删除第一行或忽略它的原因。怎么做 ? (我知道我可以在没有第一行的情况下读取文件并写入文件,但我认为这不是正确的方法......)

版本: 节点 v10.0.0 & fast-csv 5.6.0


编辑:使用@Anders Carstensen 示例进行测试:

const file = 'myfile.csv';
const fs = require("fs");
const stream = fs.createReadStream(file, {
    encoding: 'utf8'
});

stream.on('readable', () => {
    // Read through the stream until we encounter a new line
    let chunk;
    while (null !== (chunk = stream.read(1))) {

        if (chunk == '\n'){
            console.log('line break');
            break;
        }
    }
    console.log('test');


    // CSV parsing
    const csvStream = csv.fromStream(stream,
    {
        renameHeaders: false,
        headers: true,
        delimiter: ',',
        rowDelimiter: '\n',
        quoteHeaders: false,
        quoteColumns: false
    })
    .on("data", data => {
        console.log(data);

    })
    .on("error", error => {
        console.log("CSV invalid !", error);
    })
    .on("end", data => {
        console.log("End of parsing");
        console.log(data);
    });
});

输出:

line break
test
line break
test

Edit2:检查@Anders Carstensen 的解决方案答案(问题是使用 .on 而不是 .once)

【问题讨论】:

  • 来自文档:renameHeaders=false:如果您希望文件的第一行被删除并替换为 headers 选项中提供的行 - 仅用于 headers=[String]
  • 您在此处打印值而不是数据,因此上述代码存在参考错误
  • @Margon 这意味着它将第一行替换为另一个 in headers 选项(当您将错误的标题作为第一行时使用此选项,而不是在我的情况下)。我已经联系了 fast-csv,他们告诉我使用 fast-csv 选项不可能做我想做的事,但感谢您的尝试 :-)
  • @sreepurna 是的,我写这篇文章的时候很糟糕,我用正确的版本编辑了 thx

标签: javascript node.js csv


【解决方案1】:

首先,您应该仔细阅读不希望解析器查看的流部分。在这里我一直读到遇到第一行新行 (\n)。

var fs = require('fs'),
    csv = require('fast-csv');

var stream = fs.createReadStream('c:\\temp\\test.csv', {
  encoding: 'utf8'
});

stream.once('readable', function () {
  // Read through the stream until we encounter a new line
  var chunk;
  while (null !== (chunk = stream.read(1))) {
    if (chunk === '\n')
      break;
  }

  // Then do the CSV parsing
  const csvStream = csv
    .fromStream(stream,
      {
        headers: true,
        delimiter: ',',
        rowDelimiter: '\n',
        quoteHeaders: false,
        quoteColumns: false
      })
    .on("data", data => {
      // i do something with datas
      console.log('data', data);
    })
    .on("data-invalid", data => {
      console.log('invalid data', data);
    })
    .on("error", error => {
      console.log("Le fichier CSV est invalide !", error);
    })
    .on("end", data => {
      console.log("End of parsing");
      console.log(data);
    });
});

【讨论】:

  • 我试过了,但它不起作用:csvStream 永远不会启动 + 它会中断两次(在第一行和第二行之后,然后什么都没有发生)
  • 它可以在我的电脑上运行。您能否在原始帖子中添加您是如何创建 stream 的?
  • 奇特的。我在上面的示例中添加了对“数据无效”的处理。请尝试添加。您是否还可以在原始文件中添加您过去创建stream 的方式(在集成我的示例之前)? file 是什么?
  • 这只是需要的不同(我编辑过)。我尝试使用 data-invalid 相同的东西(我认为 data-invalid 用于对数据添加一些限制)
  • 上面的代码在我的机器上运行在一个包含 4 行的 utf8 编码文件上 - 第一行是垃圾,接下来是标题,接下来的两行是数据。我正在使用 NodeJS v6.10.3 和 Windows。除非您处于类似的环境中,否则我没有想法。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2015-11-30
  • 1970-01-01
  • 2015-06-13
  • 2016-05-02
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多