慕容森
我已经玩过这个,并且可以使用 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 }