为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

米琪卡哇伊 2022-06-09 16:27:50
节点版本:v10.19.0npm 版本:6.13.4npm 包 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 解析工作而不会卡住?任何帮助都感激不尽。
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

我已经玩过这个,并且可以使用 CSV 文件行挂钩csv-file-line-hook来挂钩,您可以检查无效行并修复或简单地使它们无效。


下面的示例将简单地跳过无效行(缺少结束引号)


例子.js


const 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"); 

});

测试.csv


Name;Age;Profession

Bob;34;"Sales,Marketing"

Sarah;31;"Software Engineer"

James;45;Driver

"Billy, ;35;Manager

"Timothy;23;"QA


查看完整回答
反对 回复 2022-06-09
?
三国纷争

TA贡献1804条经验 获得超7个赞

这个正则表达式效果更好


/^(?:[^"\]|\.|"(?:\.|[^"\])")$/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 }



查看完整回答
反对 回复 2022-06-09
  • 2 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信