检查 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)
}
我目前正在尝试添加一些关于我希望特定 .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)
}