如何在JavaScript中处理CSV文件比较时的双引号问题
解决商品标题与CSV文件双引号转义的匹配问题
问题背景
你现在需要把网站上9000+商品的标题和CSV文件做比对,已经实现了商品检查和CSV遍历的基础功能,但遇到了一个麻烦:部分商品标题里带有尺寸相关的双引号(比如Product item A 1/2"),而CSV文件里这类双引号会被转成两个双引号(""),导致两边的字符串匹配不上,没法执行后续操作。
现有代码
HTML代码
<div class="item-options"> <!--START: itemnamelink--> <a href="product.asp?itemid=[ITEM_CATALOGID]">[ITEM_NAME]</a> <!--END: itemnamelink--> <!--START: itemnamenolink--> <span id="Span1">[ITEM_NAME]</span> <!--END: itemnamenolink--> <!--START: itemoptions--> <br /> <a href="#" onclick="toggleProdOptions('opt[ITEM_ID]')">View/Hide options</a> <br /> <div id="opt[ITEM_ID]" name="opt[ITEM_ID]" style="display:none;">[OPTIONS]</div> <!--END: itemoptions--> <!--START: recurring_frequency--> <br /> This item will Autoship every <strong>[recurring_frequency]</strong> <!--END: recurring_frequency--> </div>
JavaScript代码
$(document).ready(function() { var itemToStore = document.getElementsByClassName("item-options"); localStorage.setItem("itemToStore", JSON.stringify(itemToStore)); var retrieved = localStorage.getItem("itemToStore"); for (var i = 0; i < itemToStore.length; i++) { var itemName= itemToStore[i].innerText; var name = (""+itemName).replace(/['"]+/g,''); console.log("Name: " + name); } $.ajax({ type: "GET", url: "assets/exports/pipe.csv", dataType:"text", success: function(data) { var code = name.split("\n"); for(var i=0;i<code.length;i++) { code[i]="\""+code[i]+"\""; } var pipeString = code.join("\n"); var test = "Pipe"; console.log(test); // Flag that value found var found = false; // Remove \n and split by , var listPipe = data.split('\r\n').map(function(row) { return row.split(','); }); var pipeList = (""+listPipe).replace(/['"]+/g,''); console.log(pipeList); // Array of arrays like be generated for (var i = 0; i < listPipe.length; i++) { if ($.inArray(test, listPipe) !== -1) { found = true; console.log("found"); } else { console.log("not found"); } } } }); });
相关截图
CSV文件内容

控制台输出

具体解决思路
1. 统一双引号处理逻辑
CSV里的""是标准的双引号转义格式(当字段包含双引号时,CSV会用两个双引号来表示单个双引号),所以我们需要在解析CSV时把""转回单个",同时保留商品标题里的双引号(或者做对应处理),让两边的字符串格式统一。
修改JS代码里的CSV解析部分:
// 解析CSV时处理转义的双引号 var listPipe = data.split('\r\n').map(function(row) { // 将CSV中的""替换为单个" var cleanedRow = row.replace(/""/g, '"'); // 再按逗号分割字段 return cleanedRow.split(','); });
同时修改商品标题的处理逻辑,不要直接去掉所有引号,而是保留原样(只清理多余空格):
var itemName = itemToStore[i].innerText; // 去掉前后空格,保留标题里的双引号 var name = itemName.trim(); console.log("Name: " + name);
2. 改用专业CSV解析库(更推荐)
手动解析CSV很容易踩坑(比如字段里包含逗号、换行的情况),推荐使用成熟的CSV解析库,比如Papa Parse,它能自动处理CSV的各种转义规则,包括双引号的转义,让解析更准确。
使用示例:
// 先引入Papa Parse库(可以通过CDN或者本地引入) $.ajax({ type: "GET", url: "assets/exports/pipe.csv", dataType:"text", success: function(data) { // 用Papa Parse解析CSV var parsedData = Papa.parse(data, { header: false, // 根据你的CSV是否有表头调整 skipEmptyLines: true }); var listPipe = parsedData.data; // 后续匹配逻辑 var test = "Pipe"; var found = false; for (var i = 0; i < listPipe.length; i++) { if ($.inArray(test, listPipe[i]) !== -1) { found = true; console.log("found"); } else { console.log("not found"); } } } });
3. 匹配时的容错处理
如果商品标题和CSV里的字符串还有其他细微差异(比如大小写、空格),可以统一转换成小写、去掉多余空格后再匹配,进一步提高匹配成功率:
// 处理商品标题 var name = itemName.trim().toLowerCase(); // 处理CSV字段 var cleanedCsvField = csvField.trim().toLowerCase(); // 再进行匹配 if (name === cleanedCsvField) { // 匹配成功逻辑 }
内容的提问来源于stack exchange,提问作者user9730036
相关产品推荐
相关产品推荐

