我是新来的。我正在开发一个读取一堆 docx 文档的程序。我使用 XPATH 和 xmldom 从他的 XML 中获取文档内容。它为我提供了包含文档每一行的数组。问题是,我有这样的东西:
[
'-1911312-14668500FECHA: 15-12-25',
'NOMBRE Y APELLIDO: Jhon dee',
'C.I.: 20020202 EDAD: 45 ',
'DIRECCION: LA CASA',
'TLF: 55555555',
'CORREO: thiisatest@gmail',
' HISTORIA CLINICA GINECO-OBSTETRICA',
'HO',
'NULIG',
'FUR',
'3-8-23',
'EG',
'',
'FPP',
'',
'GS',
'',
'GSP',
'',
'',
'MC: CONTROL GINECOLOGICO',
'HEA',
'',
'APP: NIEGA PAT, NIEGA ALER, QX NIEGA.',
'APF: MADRE HTA, ABUELA DM.',
'',
'AGO: MENARQUIA: 10 FUR: CICLO: 4/28 ',
' TIPO: EUM',
' MET ANTICONCEP: GENODERM DESDE HACE 3 AÑOS.',
'PRS: NPS: ITS: VPH LIE BAJO GRADO 2017 , BIOPSIA.',
'FUC: NOV 2022, NEGATIVA. COLPO NEGATIVA.',
'',
'',
'EMBARAZO',
'#/AÑO',
'TIPO DE PARTO',
'INDICACION',
'RN',
'SEXO',
'RN',
'PESO',
'OBSERVACIONES',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'',
'EXAMEN FISICO:',
'PESO: 80,1 TALLA: TA: MMHG FC: FR: ',
'',
'PIEL Y MUCOSA: DLN',
'CARDIOPULMONAR: DLN',
'',
'MAMAS: ',
'',
'ABDOMEN: ',
'GENITALES: CUELLO SIN SECRECION , COLPO SE EVDIENCIA DOS LEISONES HPRA 1 Y HORA 5',
'',
'EXTREMIDADES: DLN',
'NEUROLOGICO: DLN',
'',
' IDX: LESION EN CUELLO UTERINO',
'',
'PLAN: DEFEROL OMEGA, CAUTERIZACION Y TIPIFICACION VIRAL',
'22-8-23',
'SE TOMA MUESTRA DE TIPIFICACION VIRAL.',
'',
'',
'',
'LABORATORIOS:',
'FECHA',
'HB/HTO',
'LEU/PLAQ',
'GLICEMIA',
'UREA',
'CREAT',
'HIV/VDRL',
'UROANALISIS',
'',
'',
'',
'',
'',
'',
'',
'',
... 44 more items
]
所以,我想将此内容放在 js 对象上,例如:
const customObj = {
fecha: "fecha on the doc",
....
}
但是我认为这会起作用:
const fillObject = (inputArray, keywords) => {
const customObj = {};
keywords.forEach((keyword, index) => {
customObj[keyword] = inputArray.map(line => {
const keywordIndex = line.indexOf(keyword);
if (keywordIndex !== -1) {
const nextKeywordIndex = keywords.slice(index + 1).reduce((acc, nextKeyword) => {
const nextKeywordIndex = line.indexOf(nextKeyword);
return nextKeywordIndex !== -1 && nextKeywordIndex < acc ? nextKeywordIndex : acc;
}, line.length);
return line.slice(keywordIndex, nextKeywordIndex).trim();
}
return null;
}).filter(Boolean);
});
console.log(customObj);
return customObj;
};
从函数中我得到这个:关键字以及下一个关键字之前的内容,我只想获取重要的数据。 文档的格式始终相同,但有时我在关键字与其内容之间有空格,有时则没有。这些单词始终大写。
我尝试了前面提到的功能,但我想更精确地搜索以及数据在对象中的外观。最终结果必须更准确一点,因为输出实际上如下所示:
'FECHA:': [ 'FECHA: 19-10-23' ],
'NOMBRE Y APELLIDO:': [ 'NOMBRE Y APELLIDO: John Dee' ],
'C.I.:': [ 'C.I.: 3232323' ],
'EDAD:': [ 'EDAD: 56' ],
'DIRECCION:': [ 'DIRECCION: Marylan ],
'TLF:': [ 'TLF: 55555555' ],
'CORREO:': [ 'CORREO: [email protected]' ],
'CONTACTO:': [
'CONTACTO: IG HISTORIA CLINICA GINECO-OBSTETRICA'
],
正如你所看到的,有些属性很奇怪,比如“contacto”不太适合。
我不会提供一组键,而是解析输入数据以识别“键:值”模式。
请注意,您可能会产生歧义。例如,如果输入行是:
TEST: A B C: OK
那么,这可以解释为:
{
"TEST": "A",
"B C": "OK"
}
或如:
{
"TEST": "A B",
"C": "OK"
}
为了打破这种联系,我们可以捕获值greedy,这样在上面的例子中就会生成第二个输出。然而,如果我们发现至少有三个空格的分隔,那么我们可以将接下来的内容解释为一个新的键/值对,这样这个输入:
TEST: A B C: OK
...将被解释为:
{
"TEST": "A",
"B C": "OK"
}
其次,如果一个值有逗号,您可以将该值转换为数组(除非逗号是数值的一部分)。
我们可以利用正则表达式的强大功能来进行这种解析。
这是一个函数
makeObject
以及它如何适用于您的示例输入:
const multiple = arr => arr.length > 1 ? arr : arr[0];
const regex = /((?:[A-Z.]+ )*[A-Z.]+):((?: {0,2}(?!\S*:)\S+)*)/g;
const makeObject = data => Object.fromEntries(
Array.from(data.join("\n").matchAll(regex), ([, key, value]) => [
key,
multiple(value.split(/,(?!\d)/).map(val => val.trim()))
])
);
// Your sample data:
const data = ['-1911312-14668500FECHA: 15-12-25','NOMBRE Y APELLIDO: Jhon dee','C.I.: 20020202 EDAD: 45 ','DIRECCION: LA CASA','TLF: 55555555','CORREO: thiisatest@gmail',' HISTORIA CLINICA GINECO-OBSTETRICA','HO','NULIG','FUR','3-8-23','EG','','FPP','','GS','','GSP','','','MC: CONTROL GINECOLOGICO','HEA','','APP: NIEGA PAT, NIEGA ALER, QX NIEGA.','APF: MADRE HTA, ABUELA DM.','','AGO: MENARQUIA: 10 FUR: CICLO: 4/28 ',' TIPO: EUM',' MET ANTICONCEP: GENODERM DESDE HACE 3 AÑOS.','PRS: NPS: ITS: VPH LIE BAJO GRADO 2017 , BIOPSIA.','FUC: NOV 2022, NEGATIVA. COLPO NEGATIVA.','','','EMBARAZO','#/AÑO','TIPO DE PARTO','INDICACION','RN','SEXO','RN','PESO','OBSERVACIONES','','','','','','','','','','','','','','','','','','','','EXAMEN FISICO:','PESO: 80,1 TALLA: TA: MMHG FC: FR: ','','PIEL Y MUCOSA: DLN','CARDIOPULMONAR: DLN','','MAMAS: ','','ABDOMEN: ','GENITALES: CUELLO SIN SECRECION , COLPO SE EVDIENCIA DOS LEISONES HPRA 1 Y HORA 5','','EXTREMIDADES: DLN','NEUROLOGICO: DLN','',' IDX: LESION EN CUELLO UTERINO','','PLAN: DEFEROL OMEGA, CAUTERIZACION Y TIPIFICACION VIRAL','22-8-23','SE TOMA MUESTRA DE TIPIFICACION VIRAL.','','','','LABORATORIOS:','FECHA','HB/HTO','LEU/PLAQ','GLICEMIA','UREA','CREAT','HIV/VDRL','UROANALISIS','','','','','','','','',];
console.log(makeObject(data));
您将在输出中看到它可以找到的all键,甚至那些具有空值的键(例如
AGO
)。只需从该对象中提取您需要的内容即可。