npm package csvto json Ошибка синтаксического анализа CSV: ошибка: unclosed_quote - PullRequest
1 голос
/ 02 апреля 2020
  • Версия узла: v10.19.0
  • Npm версия: 6.13.4
  • Npm пакет csvto json Пакетная ссылка

    csvtojson({
     "delimiter": ";",
     "fork": true
    })
    .fromStream(fileReadStream)
    .subscribe((dataObj) => {
    console.log(dataObj);
    }, (err) => {
    console.error(err);
    }, (success) => {
    console.log(success);
    });
    

При попытке обработать большой файл CSV (около 1,3 миллиона записей) я сталкиваюсь с ошибкой " Ошибка синтаксического анализа CSV: ошибка: unclosed_quote. " после определенного записи (например, после 400+ записей) успешно обрабатываются. Из файла CSV я не вижу проблем с форматированием данных, однако парсер может вызывать эту ошибку из-за того, что внутри значения столбца / поля обнаружен символ «\ n».

  • Is Есть ли решение уже доступно с этим пакетом? или
  • Есть ли способ обойти эту ошибку? или
  • есть ли способ пропустить такие строки CSV, имеющие какие-либо ошибки, не только эту, чтобы позволить всему CSV выполнять синтаксический анализ JSON без зависания обработки?

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 02 апреля 2020

Я поиграл с этим, и можно подключиться к этому, используя CSV File Line Hook, 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"); 
});

test.csv

Name;Age;Profession
Bob;34;"Sales,Marketing"
Sarah;31;"Software Engineer"
James;45;Driver
"Billy, ;35;Manager
"Timothy;23;"QA
...