从docx提取的文本数组中精准提取数据生成JS对象的问题
优化DOCX数据提取逻辑的解决方案
针对你遇到的关键词与内容空格不固定、字段提取精度差的问题,可以通过以下方式改进fillObject函数:
核心优化思路
- 用正则表达式处理任意数量的空白分隔符,精准匹配关键词与对应内容
- 支持跨多行的字段内容拼接(部分字段内容可能换行显示)
- 避免无关文本混入目标字段
改进后的代码实现
function fillObject(lines, targetObj, keywords) { // 为每个关键词生成匹配正则,兼容任意空格分隔,捕获有效内容 const regexMap = keywords.reduce((map, key) => { // 匹配关键词开头,忽略后续任意空白,捕获直到行尾的内容 // 若需兼容大小写,可在正则后添加'i'标志,如new RegExp(`^${key}\\s*(.*)$`, 'i') map[key] = new RegExp(`^${key}\\s*(.*)$`); return map; }, {}); let currentField = null; // 跟踪需要跨行拼接的字段 lines.forEach(line => { const cleanLine = line.replace(/<[^>]+>/g, '').trim(); // 清理XML标签残留 if (!cleanLine) return; let isKeywordLine = false; // 遍历关键词,检查当前行是否为关键词行 for (const [key, regex] of Object.entries(regexMap)) { const match = cleanLine.match(regex); if (match) { const content = match[1].trim(); if (content) { targetObj[key] = content; currentField = null; } else { // 关键词行无内容,标记为待填充字段,后续行补充 currentField = key; } isKeywordLine = true; break; } } // 非关键词行且存在待填充字段时,追加内容 if (!isKeywordLine && currentField) { targetObj[currentField] = (targetObj[currentField] || '') + ' ' + cleanLine; } }); return targetObj; } // 示例调用 const docLines = [ "CONTACTO Maria Lopez", "TELEFONO +34 123 456 789", "DIRECCION ", "Av. de la Constitucion 45", "BARRIO Centro", "CIUDAD Barcelona" ]; const result = {}; fillObject(docLines, result, ['CONTACTO', 'TELEFONO', 'DIRECCION', 'BARRIO', 'CIUDAD']); console.log(result);
额外优化建议
- 如果某字段(如CONTACTO)有固定格式(如包含姓名、电话),可在赋值前添加校验逻辑,例如用正则判断内容是否符合预期格式,过滤无关文本
- 若文档中关键词可能带冒号(如
CONTACTO:),可修改正则为^${key}:?\\s*(.*)$,兼容带冒号的格式 - 处理多行内容时,可根据实际需求调整拼接规则(如是否保留换行符)
内容的提问来源于stack exchange,提问作者luis-san
相关产品推荐
相关产品推荐

