如何避免使用 csv-parse for await...of
How to avoid for await...of with csv-parse
我希望得到关于这个问题的教育,因为我已经花了几天时间尝试自己解决它,但无济于事。
我正在使用 csv-parse 解析 CSV 文件。
我正在使用 ESLint 作为我的 Linter
我正在为 ESLint
使用 Airbnb JavaScript Style Guide 插件
我 运行 在后端使用 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 的风格指南,或者,如果这是可以忽略违规的情况之一?
风格指南说:
11.2 Don’t use generators for now.
Why? They don’t transpile well to ES5.
幸运的是,如果您使用的是最新的 NodeJS 版本,则无需向下编译,并且可以使用引擎的本机支持。对于浏览器,此建议也很快就会过时。
使用事件结束返回承诺怎么样?
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+,则尝试 stream/promises 示例:
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;
}
根据答案中给出的建议,我将忽略 Airbnb Style Guide and use the Async iterator 方法。
最终代码:
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 的代码建议(我采纳了您的一个想法,使我的代码更具可读性)。
我希望得到关于这个问题的教育,因为我已经花了几天时间尝试自己解决它,但无济于事。
我正在使用 csv-parse 解析 CSV 文件。
我正在使用 ESLint 作为我的 Linter
我正在为 ESLint
使用 Airbnb JavaScript Style Guide 插件
我 运行 在后端使用 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 的风格指南,或者,如果这是可以忽略违规的情况之一?
风格指南说:
11.2 Don’t use generators for now. Why? They don’t transpile well to ES5.
幸运的是,如果您使用的是最新的 NodeJS 版本,则无需向下编译,并且可以使用引擎的本机支持。对于浏览器,此建议也很快就会过时。
使用事件结束返回承诺怎么样?
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+,则尝试 stream/promises 示例:
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;
}
根据答案中给出的建议,我将忽略 Airbnb Style Guide and use the Async iterator 方法。
最终代码:
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 的代码建议(我采纳了您的一个想法,使我的代码更具可读性)。