XML解析忽略特殊字符:零件号匹配功能异常求助
问题背景
我需要解析特定XML文件,忽略其中零件号的特殊字符(具体为连字符-),将其与CSV文件中的零件号匹配,输出对应的品牌ID。目前CSV中的零件号不含特殊字符,但XML中的零件号带有-,现有代码功能正常,唯独无法处理这种带特殊字符的匹配问题。
现有代码
const path = require("path"); const fs = require("fs"); const parser = require('xml2json'); const { parseList } = require("./utils/helpers"); const lodash = require("lodash"); const csv = require("fast-csv"); const file ='4E-2022-10-24-Pies'; const PiesfilePath = path.resolve( __dirname, `${file}.xml` ); const imagefilePath = path.resolve( __dirname, "4E-2022-10-24-Image.csv" ); const output = fs.createWriteStream( `images-map.txt`, { flags: "a", } ); //output.write('B15 B20 P05 P10 P15\n'); const timer = ms => new Promise(resolve => setTimeout(resolve, ms)); const init = async () => { var PIEs=''; const ImagesArray = await parseList(imagefilePath); const digitalAssets = []; fs.readFile( PiesfilePath, function(err, data) { PIEs = parser.toJson(data); PIEs = JSON.parse(PIEs); // console.log(PIEs.PIES.Items); for (let i = 0; i <PIEs.PIES.Items.Item.length ; i += 1) { // let item = PIEs.PIES.Items.Item[i]; // if(item?.DigitalAssets){ digitalAssets.push({ "PartNumber":item.PartNumber, "BrandAAIAID": item.BrandAAIAID, }) // console.log(item); } const digitalAssetsDic = lodash.mapKeys(digitalAssets, "PartNumber"); for (let z = 0; z <ImagesArray.length ; z += 1) { let Image= ImagesArray[z]; let digitalAsset = digitalAssetsDic[Image.PartNumber]; if(digitalAsset){ let imagefile = Image.ImageName; output.write(`${Image.PartNumber} ${digitalAsset.BrandAAIAID} ${imagefile} ${imagefile.includes('_Fro')?'P04':'P01'} ${imagefile.split(".")[1]}\n`); } } // }); //let productsfull = await parseList(inputPath2); //const productsDec= lodash.mapKeys(products,"itemId"); }; init();
解决方案
核心思路是统一零件号格式:将XML中的零件号移除所有连字符-后构建匹配字典,同时为了兼容后续数据变化,查找时对CSV的零件号也做相同处理(当前CSV无特殊字符,处理后不影响结果)。
修改后的完整代码
const path = require("path"); const fs = require("fs"); const parser = require('xml2json'); const { parseList } = require("./utils/helpers"); const lodash = require("lodash"); const csv = require("fast-csv"); const file ='4E-2022-10-24-Pies'; const PiesfilePath = path.resolve( __dirname, `${file}.xml` ); const imagefilePath = path.resolve( __dirname, "4E-2022-10-24-Image.csv" ); const output = fs.createWriteStream( `images-map.txt`, { flags: "a", } ); //output.write('B15 B20 P05 P10 P15\n'); const timer = ms => new Promise(resolve => setTimeout(resolve, ms)); const init = async () => { var PIEs=''; const ImagesArray = await parseList(imagefilePath); const digitalAssets = []; fs.readFile( PiesfilePath, function(err, data) { PIEs = parser.toJson(data); PIEs = JSON.parse(PIEs); for (let i = 0; i <PIEs.PIES.Items.Item.length ; i += 1) { let item = PIEs.PIES.Items.Item[i]; // 移除XML零件号中的所有连字符 digitalAssets.push({ "PartNumber": item.PartNumber.replace(/-/g, ''), "BrandAAIAID": item.BrandAAIAID, }) } // 用处理后的零件号构建匹配字典 const digitalAssetsDic = lodash.mapKeys(digitalAssets, "PartNumber"); for (let z = 0; z <ImagesArray.length ; z += 1) { let Image= ImagesArray[z]; // 查找时统一处理CSV零件号格式(兼容后续可能出现的特殊字符) let digitalAsset = digitalAssetsDic[Image.PartNumber.replace(/-/g, '')]; if(digitalAsset){ let imagefile = Image.ImageName; output.write(`${Image.PartNumber} ${digitalAsset.BrandAAIAID} ${imagefile} ${imagefile.includes('_Fro')?'P04':'P01'} ${imagefile.split(".")[1]}\n`); } } }); }; init();
内容的提问来源于stack exchange,提问作者Samuel Badders
相关产品推荐
相关产品推荐

