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

CSV-Parser 似乎无法正确解析换行数据

CSV-Parser 似乎无法正确解析换行数据

HUX布斯 2022-06-09 19:07:08
是的,我知道我应该有更好的数据,如果没有任何效果,我会修复我的数据,但我想知道是否有任何方法可以让 csv-parser 解析器解析"United States ofAmerica",140640,17987,2398,286,Local transmission,0进入{Country: United States of America... blah blah... blah blah... blah blah... blah blah}fs.createReadStream("./csv/03312020.csv")    .pipe(        csv([            "Country",            "Total",            "TotalNew"        ])    )    .on("data", row => {        console.log(row.Country);        let result = contains(row.Country);        if (result !== undefined) {            row.Date = today;            row.id = result + "-" + today;            if (db.dates.get(row.id) === undefined) db.dates.create(row);        }    })    .on("end", () => {        console.log("CSV file successfully processed for", today);    });我认为 csv-parser 会看到有一个引号并将其包装为一个“列”,但显然它没有。除了重新解析我的 CSV 文件本身之外,还有更好的方法来解析这些数据吗?
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

您可以做的是将该文件拆分为行,然后加入具有奇数个 " 字符的行。


我的脚本还处理 \n 字符在单行数据中多次出现的情况。

这是基于这样一个事实,即只有多行行的第一行和最后一行会有奇数个 " 字符。


您可以使用我的脚本重新格式化您的文件,然后将其输入您的 csv 解析器。


const example1 = `"United States of

America",140640,17987,2398,286,Local transmission,0`;


console.log(reformatCsv(example1));


const example2 = `"United States of

America",140640,17987,2398,286,"Local

transmission",0`;


console.log(reformatCsv(example2));



// @param file: string

function reformatCsv(file)

{

    const lines = file.split('\n');


    let reformattedRows = [];


    const parts = [];


    for (const line of lines)

    {

        const quoteMatches = line.match(/"/g);

        const isEvenNumberOfQuotes = !quoteMatches || quoteMatches.length % 2 == 0;

        const noPartialRowsYet = !parts.length;


        if (noPartialRowsYet)

        {

            if (isEvenNumberOfQuotes) // normal row

            {

                reformattedRows.push(line);

            }

            else // this is a partial row

            {

                parts.push(line);

            }

        }

        else // continuation of a partial row

        {

            parts.push(line);

            if (!isEvenNumberOfQuotes) // we got all of the parts

            {

                // join the parts

                // I replace \n with a space character, but you don't have to

                reformattedRows.push(parts.join(' '));

            }

        }

    }


    return reformattedRows.join('\n');


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

添加回答

举报

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