如何用JavaScript解析含合并单元格的CSV文件并输出指定结构数据
你要的这种针对Excel合并单元格导出CSV后自动填充空值、再按指定字段聚合的场景,没有完全开箱即用的现成解析工具,不过可以结合JS生态最成熟的CSV解析库Papa Parse,加少量自定义逻辑实现,稳定性远高于完全手写CSV解析逻辑。
实现步骤
- 首先安装
Papa Parse处理基础CSV解析逻辑,它已经覆盖了CSV各种边缘场景的兼容,比如带逗号/引号/换行的单元格、编码兼容等问题:
npm install papaparse
如果是浏览器环境直接下载库的单文件引入即可使用。
- 编写解析和聚合逻辑,示例代码如下:
import Papa from 'papaparse' // 你的CSV内容,也可以通过文件读取传入 const csvContent = `Main ,MainDescription,Secondry,Code First,First Description,First Secondry 1,CODE 1 ,,First Secondry 2,CODE 2 ,,First Secondry 3,CODE 3 ,,First Secondry 4,CODE 4 ,,First Secondry 5,CODE 5 ,,First Secondry 6,CODE 6 ,,First Secondry 7,CODE 7 ,,First Secondry 8,CODE 8 Second,Second Description,Second Secondry 1,CODE 9 ,,Second Secondry 2,CODE 10 ,,Second Secondry 3,CODE 11 ,,Second Secondry 4,CODE 12 ,,Second Secondry 5,CODE 13 ,,Second Secondry 6,CODE 14 ,,Second Secondry 7,CODE 15 ,,Second Secondry 8,CODE 16` // 第一步:用Papa Parse解析CSV为基础行列数据 const parseResult = Papa.parse(csvContent, { header: false, skipEmptyLines: true }) const rows = parseResult.data const headers = rows[0].map(item => item.trim()) // 处理表头空格 const dataRows = rows.slice(1) // 第二步:填充空单元格(继承上一行同列的非空值) let lastValidRow = {} const filledRows = dataRows.map(row => { const filled = {} headers.forEach((header, index) => { const val = row[index]?.trim() filled[header] = val || lastValidRow[header] }) lastValidRow = { ...filled } return filled }) // 第三步:按Main字段聚合,归集Secondry和Code为数组 const result = Object.values( filledRows.reduce((acc, cur) => { if (!acc[cur.Main]) { acc[cur.Main] = { Main: cur.Main, MainDescription: cur.MainDescription, Secondry: [], Code: [] } } acc[cur.Main].Secondry.push(cur.Secondry) acc[cur.Main].Code.push(cur.Code) return acc }, {}) ) console.log(JSON.stringify(result, null, 2))
运行上述代码即可得到你要求的输出格式。
内容的提问来源于stack exchange,提问作者Sabir Moglad
相关产品推荐
相关产品推荐

