作为我正在构建的应用程序的一部分,我使用 csv-parse 读取和操作大型 (约5.5GB,800万行) 的 csv 文件。我已经让这个过程相对顺利地运行了起来,但是遇到了一个问题 - 如何捕获由不一致的列数引发的错误。
我使用管道函数,因为它与应用程序的其余部分很好地配合使用,但是我的问题是,如何将解析器抛出的错误重定向到日志,并允许进程继续进行?
我知道可以使用 "relax_column_count" 选项跳过具有不一致列数的记录,该选项几乎足够满足需求。但是由于数据质量评估的目的,我需要记录这些记录,以便在以后可以查看导致错误列数的原因(该过程具有许多潜在故障点)。
此外,我知道解决这个问题最简单的方法是在此过程上游清理数据,但不幸的是,我无法控制数据源。
在这个示例集中,例如,我会遇到以下错误:
事件.js:141 抛出 er; // 未处理的“错误”事件 错误:第(行号)行的列数与标题不匹配
代码:
我使用管道函数,因为它与应用程序的其余部分很好地配合使用,但是我的问题是,如何将解析器抛出的错误重定向到日志,并允许进程继续进行?
我知道可以使用 "relax_column_count" 选项跳过具有不一致列数的记录,该选项几乎足够满足需求。但是由于数据质量评估的目的,我需要记录这些记录,以便在以后可以查看导致错误列数的原因(该过程具有许多潜在故障点)。
此外,我知道解决这个问题最简单的方法是在此过程上游清理数据,但不幸的是,我无法控制数据源。
在这个示例集中,例如,我会遇到以下错误:
事件.js:141 抛出 er; // 未处理的“错误”事件 错误:第(行号)行的列数与标题不匹配
样例数据(实际上并不是我的数据,但演示了同样的问题):
year, month, value1, value2
2012, 10, A, B
2012, 11, B, C,
2012, 11, C, D,
2013, 11, D, E,
2013, 11, E, F,
2013, 11, F,
2013, 11, G, G,
2013, 1, H, H,
2013, 11, I, I,
2013, 12, J, J,
2014, 11, K, K,
2014, 4, L, L,
2014, 11, M, M,
2014, 5, N,
2014, 11, O, N,
2014, 6, P, O,
2015, 11, Q, P,
2015, 11, R, Q,
2015, 11, S, R,
2015, 11, T, S,
代码:
const fs = require('fs');
const parse = require('csv-parse');
const stringify = require('csv-stringify');
const transform = require('stream-transform');
const paths = {
input: './sample.csv',
output: './output.csv',
error: './errors.csv',
}
var input = fs.createReadStream(paths.input);
var output = fs.createWriteStream(paths.output);
var error = fs.createWriteStream(paths.error);
var stringifier = stringify({
header: true,
quotedString: true,
});
var parser = parse({
relax: true,
delimiter: ',',
columns: true,
//relax_column_count: true,
})
var transformer = transform((record, callback) => {
callback(null, record);
}, {parallel: 10});
input.pipe(parser).pipe(transformer).pipe(stringifier).pipe(output);
你有什么想法?