搜索长字符串数组中的特定事物。然后将其保存在 JSON 对象中

问题描述 投票:0回答:1

我是新来的。我正在开发一个读取一堆 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”不太适合。

javascript string loops data-structures substring
1个回答
0
投票

我不会提供一组键,而是解析输入数据以识别“键:值”模式。

请注意,您可能会产生歧义。例如,如果输入行是:

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
)。只需从该对象中提取您需要的内容即可。

© www.soinside.com 2019 - 2024. All rights reserved.