如何使用JavaScript向CSV文件的指定列添加对应内容?
问题背景
我对JavaScript掌握程度不高,此前在stackoverflow.com搜索相关解决方案未获得有效帮助。当前需要实现CSV生成功能:将数组的键作为CSV列标题/索引,对应的数组值作为列内容,写入对应列标题的下方,但编写的代码运行后,数据仅展示在两列中,不符合预期。
原问题代码:
function downloadCSV(csvStr) { CSV = ConvertToCSV(csvStr); var uri = [ [ 'application.csv','data:text/csv;charset=utf-8,' + escape(CSV) ]]; downloadAll(uri) } function ConvertToCSV(objArray) { var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray; let str = ""; for (var i = 0; i < array.length; i++) { var line = ''; for (var index in array[i]) { if (line != '') line += '' line += `${index} ,` line += `${array[i][index]}` } str += line + '\n'; } return str; }
待处理数据
使用的待处理数组数据如下,需要将First、Street Address等字段作为CSV的列标题:
0: {First: 'asdkjf,\n', Street Address: 'lasdkfj ,\n', City: 'alsdf,\n', State: 'Alaska,\n', ZIP / Postal Code: 'asl;dfj,\n', …} 1: {First: 'asdkjf,\n', Street Address: 'lasdkfj ,\n', City: 'alsdf,\n', State: 'Alaska,\n', ZIP / Postal Code: 'asl;dfj,\n', …}
异常效果
当前代码运行得到的CSV结果异常,实际效果如下:
问题根因
- 未单独生成表头行:遍历每一条数据时都重复拼接键名和值,没有将列标题统一放在第一行
- 分隔符逻辑错误:键名后添加了逗号,但值与后续字段之间没有加逗号分隔,导致键和对应值被拆到两列,所有内容错位堆在两列中
- 未处理特殊字符:字段值中自带的逗号、换行符会被CSV解析器识别为列分隔符,直接拼接会导致列错位
- 下载逻辑使用已废弃的
escape()方法,存在编码兼容问题,且没有处理Excel打开CSV的中文乱码场景
修正后代码
function downloadCSV(csvStr, filename = 'application.csv') { const csvContent = ConvertToCSV(csvStr); // 添加BOM头解决Excel打开乱码问题 const blob = new Blob(['\ufeff' + csvContent], { type: 'text/csv;charset=utf-8;' }); const downloadUrl = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = downloadUrl; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(downloadUrl); } function ConvertToCSV(objArray) { const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray; if (!array.length) return ''; // 提取第一行的所有键作为统一列标题 const headers = Object.keys(array[0]); const csvLines = [ headers.map(field => escapeCSVSpecialChar(field)).join(',') ]; // 按表头顺序逐行拼接数据 for (const row of array) { const line = headers.map(header => escapeCSVSpecialChar(row[header] ?? '')).join(','); csvLines.push(line); } return csvLines.join('\n'); } // 处理CSV字段特殊字符,避免格式错乱 function escapeCSVSpecialChar(field) { let fieldStr = String(field).trim(); // 字段包含逗号、换行、双引号时,用双引号包裹,内部双引号转义为两个双引号 if ([',', '\n', '"'].some(char => fieldStr.includes(char))) { fieldStr = `"${fieldStr.replace(/"/g, '""')}"`; } return fieldStr; }
修正点说明
- 单独提取数组对象的键作为表头,仅在CSV第一行输出列标题,后续行只输出对应列的内容
- 统一字段分隔逻辑,所有表头、内容字段之间用逗号分隔,不会出现内容错位
- 新增特殊字符转义逻辑,自动处理字段内的逗号、换行、双引号,避免解析时列错乱
- 替换废弃的
escape()方法,用Blob生成下载链接,兼容性更好,添加BOM头解决Excel打开CSV的乱码问题 - 自动清理字段首尾的无效空白、多余换行,避免生成的CSV出现多余空行
内容的提问来源于stack exchange,提问作者Aurang Zeb
相关产品推荐
相关产品推荐

