检查 CSV headers 是否匹配,如果匹配则继续解析,否则停止

Check if CSV headers match, if they match continue parsing otherwise stop

我目前正在尝试添加一些关于我希望特定 .CSV 格式在继续使用 PapaParse 进行解析之前的描述的验证。

所以我的想法是先检查 headers 是否等同于以下内容:

Extension, company, name

然后继续解析,否则我会返回一条错误消息,指出格式错误。

所有解析都是使用 PapaParse 完成的。

Ave 对此并不满意,但以下是当前代码:

var result = [];

$("#CSV-Upload").click(function () {
        $("input[type=file]").parse({
            config : {
                header : true,
                skipEmptyLines : true,
                complete : function (results, file) {
                    console.log("This file done:", file, results);
                    var string = JSON.stringify(results['data']);
                    result.push(string);
                    console.log("CSV Array: " + string);
                }
            },
            complete : function () {
                console.log("All files done!");
            }
        });
        $("#csv-file").val('');
    });

如果我没理解错的话,您想检查 header 中是否存在某个键。要使用 papa parse 这样做,我建议使用 streaming。在 papa parse 中,streaming 的概念是在解析器读取数据时处理数据。

基本上,您将检查 step 函数返回的 row object 中的特定键。查看以下代码:

var allKeyPresent = false; // Flag

Papa.parse(file, {
    header : true,
    skipEmptyLines : true,
    step: function(row, parser){
        if (!allKeyPresent) { //Only chek if flag is not set, i.e, for the first time
            parser.pause(); // pause the parser
            var first_row_data = row.data[0];
            // Now check object keys, if it match
            if (('Extension' in first_row_data) && ('name' in first_row_data) && ('email' in first_row_data)) {
                //every required key is present
                allKeyPresent = true;

                // Do your data processing here

                parser.resume();
            } else{
                //some key is missing, abort parsing
                parser.abort();
            }

        } else{ // we already match the header, all required key is present

            // Do the Data processing here

        }

    }
});

要了解有关在 papa parse 中流式传输的更多信息,请查看 this. Also, see more about the step function in the config explanation section of the documentation

希望对您有所帮助。如果您有任何其他相关问题,请告诉我。

async importData(path:string){
        const planilha:any[] = [] 
        const unparsed = fs.readFileSync(path, 'utf-8')             
        Papa.parse(unparsed,{   
            header:true,                
            skipEmptyLines:true,
            step:function(row,parser){
            if(row.meta.fields?.length!==4){
                    parser.abort()
                    fs.unlinkSync(path)
                    throw new BadRequestException('a planilha de importação deve ter 4 campos: name, phone,email e cpf nesta ordem e nestes formatos')
                }
                if(row.meta.fields[0]!=='name'){
                    parser.abort()
                    fs.unlinkSync(path)
                    throw new BadRequestException('o primeiro campo da planilha deve ser "name" ')
                }
                if(row.meta.fields[1]!=='phone'){
                    parser.abort()
                    fs.unlinkSync(path)
                    throw new BadRequestException('o segundo campo da planilha deve ser "phone" ')
                }
                if(row.meta.fields[2]!=='email'){
                    fs.unlinkSync(path)
                    throw new BadRequestException('o terceiro campo da planilha deve ser "email" ')
                }
                if(row.meta.fields[3]!=='cpf'){
                    parser.abort()
                    fs.unlinkSync(path)
                    throw new BadRequestException('o quarto campo da planilha deve ser "cpf" ')
                } 
                  
                    planilha.push(row.data)
                    parser.resume()             
                   
            }                               
        })
    fs.unlinkSync(path)

}