npm 包 csvtojson CSV 解析错误:错误:unclosed_quote

节点版本:v10.19.0

npm 版本:6.13.4

npm 包 csvtojson包链接


csvtojson({

 "delimiter": ";",

 "fork": true

})

.fromStream(fileReadStream)

.subscribe((dataObj) => {

console.log(dataObj);

}, (err) => {

console.error(err);

}, (success) => {

console.log(success);

});

在尝试处理大型 CSV 文件(大约 130 万条记录)时,在成功处理某些记录(例如 400 多条记录之后)后,我遇到了错误“ CSV Parse Error: Error: unclosed_quote. ”。从 CSV 文件中,我看不到那里的数据格式有任何问题,但是解析器可能会引发此错误,因为在列/字段值中发现了“\n”字符。


此软件包是否已有可用的解决方案?或者

有解决此错误的解决方法吗?或者

有没有办法跳过这样的 CSV 行,而不仅仅是这个错误,让整个 CSV 到 JSON 解析工作而不会卡住?

任何帮助都感激不尽。


米琪卡哇伊
浏览 238回答 2
2回答

慕容森

我已经玩过这个,并且可以使用 CSV 文件行挂钩csv-file-line-hook来挂钩,您可以检查无效行并修复或简单地使它们无效。下面的示例将简单地跳过无效行(缺少结束引号)例子.jsconst fs = require("fs");let fileReadStream = fs.createReadStream("test.csv");let invalidLineCount = 0;const csvtojson = require("csvtojson");csvtojson({ "delimiter": ";", "fork": true }).preFileLine((fileLineString, lineIdx)=> {    let invalidLinePattern = /^['"].*[^"'];/;    if (invalidLinePattern.test(fileLineString)) {        console.log(`Line #${lineIdx + 1} is invalid, skipping:`, fileLineString);        fileLineString = "";        invalidLineCount++;    }    return fileLineString}).fromStream(fileReadStream) .subscribe((dataObj) => {     console.log(dataObj);}, (err) => {     console.error("Error:", err); }, (success) => {    console.log("Skipped lines:", invalidLineCount);    console.log("Success"); });测试.csvName;Age;ProfessionBob;34;"Sales,Marketing"Sarah;31;"Software Engineer"James;45;Driver"Billy, ;35;Manager"Timothy;23;"QA

三国纷争

这个正则表达式效果更好/^(?:[^"\]|\.|"(?:\.|[^"\])")$/g这是通过读取每一行来处理大文件的更复杂的工作脚本import csv from 'csvtojson'import fs from 'fs-extra'import lineReader from 'line-reader'import { __dirname } from '../../../utils.js'const CSV2JSON = async(dumb, editDumb, headers, {    options = {        trim: true,        delimiter: '|',        quote: '"',        escape: '"',        fork: true,        headers: headers    }} = {}) => {    try {        log(`\n\nStarting CSV2JSON - Current directory: ${__dirname()} - Please wait..`)        await new Promise((resolve, reject) => {            let firstLine, counter = 0            lineReader.eachLine(dumb, async(line, last) => {                counter++                // log(`line before convert: ${line}`)                let json = (                    await csv(options).fromString(headers + '\n\r' + line)                        .preFileLine((fileLineString, lineIdx) => {                            // if it its not the first line                                // eslint-disable-next-line max-len                                if (counter !== 1 && !fileLineString.match(/^(?:[^"\\]|\\.|"(?:\\.|[^"\\])*")*$/g)) {                                    // eslint-disable-next-line max-len                                    console.log(`Line #${lineIdx + 1} is invalid. It has unescaped quotes. We will skip this line.. Invalid Line: ${fileLineString}`)                                    fileLineString = ''                                }                            return fileLineString                        })                        .on('error', e => {                            e = `Error while converting CSV to JSON.                            Line before convert: ${line}                            Error: ${e}`                            throw new BaseError(e)                        })                )[0]                // log(`line after convert: ${json}`)                if (json) {                    json = JSON.stringify(json).replace(/\\"/g, '')                    if (json.match(/^(?:[^"\\]|\\.|"(?:\\.|[^"\\])*")*$/g)) {                        await fs.appendFile(editDumb, json)                    }                }                if (last) {                    resolve()                }            })        })    } catch (e) {        throw new BaseError(`Error while converting CSV to JSON - Error: ${e}`)    }}export { CSV2JSON }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript