0

我希望在这个问题上接受教育,因为我花了几天时间试图自己解决它,但无济于事。

我正在使用csv-parse来解析 CSV 文件。
我正在使用ESLint作为我的 Linter
我正在使用 ESLint 的Airbnb JavaScript 样式指南插件 我正在使用 NodeJS
在后端运行它

我的功能是:

const { parse } = require('csv-parse');
const fs = require('fs');
const csvFile = 'myCsvFile.csv';

async function parseCsv(csvFile) {
  const records = [];
  const parser = fs.createReadStream(csvFile).pipe(parse({ delimiter: ',', columns: true }));
  for await (const record of parser) {
    records.push(record);
  }
  return records;

该功能运行良好,但我试图遵守 Airbnb 的风格指南,它不喜欢for await...of循环,因为它no-restricted-syntax违反了我。

我很好奇是否有更好的方法来编写它以符合 Airbnb 的风格指南,或者,如果这是可以忽略违规的情况之一?

4

3 回答 3

3

风格指南说:

11.2 暂时不要使用生成器。为什么?它们不能很好地转换为 ES5。

幸运的是,如果您使用的是最新的 NodeJS 版本,则无需向下转换,并且可以使用引擎的原生支持。对于浏览器,这个建议也很快就过时了。

于 2021-12-19T22:08:31.863 回答
1

根据答案中给出的建议,我将忽略Airbnb 样式指南并使用异步迭代器方法。

最终代码:

const { parse } = require('csv-parse');
const fs = require('fs');
const path = require('path');
const debug = require('debug')('app:csv:service');
const chalk = require('chalk');

async function parseCsv(csvFile) {
  try {
    const records = [];
    const stream = fs.createReadStream(csvFile);
    const parser = stream.pipe(parse({ delimiter: ',', columns: true }));
    // eslint-disable-next-line no-restricted-syntax
    for await (const record of parser) {
      records.push(record);
    }
    return records;
  } catch (error) {
    debug(`${chalk.red('Failed')} to parse CSV`);
    debug(`${chalk.red('ERROR:')} ${error}`);
    throw error;
  }
}

可能是时候寻找一个新的风格指南来遵循了。感谢num8er的代码建议(我采纳了您的一个想法,使我的代码更具可读性)。

于 2021-12-20T15:15:51.850 回答
0

使用事件结束返回承诺怎么样?

const { parse } = require('csv-parse');
const fs = require('fs');
const csvFile = 'myCsvFile.csv';

async function parseCsv(csvFile) {
  return new Promise((resolve) => {
    const records = [];
    const stream = fs.createReadStream(csvFile);
    const parser = stream.pipe(parse({ delimiter: ',', columns: true }));
    
    parser.on('readable', () => {
      while (record = parser.read()) {
        records.push(record);
      }
    });

    let ended = false;
    const end = (error) => {
      if (error) {
        console.error(error.message);
      }

      if (!ended) {
        ended = true;
        resolve(records);
      }
    };

    parser.on('error', end);
    parser.on('end', end);
  });
}

如果你有节点 15+ 然后尝试流/承诺示例:

const { parse } = require('csv-parse');
const fs = require('fs');
const { finished } = require('stream/promises');
const csvFile = 'myCsvFile.csv';

async function parseCsv(csvFile) {
    const records = [];
    const stream = fs.createReadStream(csvFile);
    const parser = stream.pipe(parse({ delimiter: ',', columns: true }));

    parser.on('readable', () => {
      let record;
      while ((record = parser.read()) !== null) {
        records.push(record);
      }
    });

    await finished(parser);

    return records;
}

csv 解析 + 流/承诺

于 2021-12-19T22:19:59.533 回答