Estoy tratando de analizar los datos que el usuario pega desde un archivo de Excel. y el código se ve así:
onPastingContacts(e) { const pastedData = e.clipboardData.getData('Text'); const allPastedFields = pastedData.split('\n').filter(el => el !== ''); allPastedFields.forEach(el => { const field = el.split('\t'); let element = { 'field1': field[0]?.replace(/\r/g, ''), 'field2': field[1]?.replace(/\r/g, ''), 'field3': field[2]?.replace(/\r/g, ''), 'field4': field[3]?.replace(/\r/g, ''), 'field5': field[4]?.replace(/\r/g, ''), 'field6': field[5]?.replace(/\r/g, '') }; Object.keys(element).forEach((key) => (element[key] == null) && delete element[key]); // remove empty fields from object Data.push(element) }); return {Data} },Y funciona bien en general. El problema es que si el archivo contiene texto con '\n' o '\t', lo analiza como si fuera una nueva línea en el archivo (o si fuera una nueva celda).
por ejemplo, si estoy tratando de pegar este archivo:
si imprimo los datos pegados se ve así:
523961234 "This is an example with new line "
y si imprimo la matriz de datos se ve así:
[{field1: '523961234', field2: 'This is an example'}, {field1: 'with new line '}]Y necesito que este sea el resultado:
[{field1: '523961234', field2: 'This is an example \n with new line '}]Sé por qué es append, ¿alguien tiene una idea de cómo puedo analizar de una manera que funcione?
Lo que puede hacer es eliminar las nuevas líneas en todas partes donde haya comillas intermedias. Puede usar este RegEx /\n+(?=(?:(?!\"|\").)*\")/gs para encontrar estas nuevas líneas. Así que la línea
onPastingContacts(e) { const pastedData = e.clipboardData.getData('Text'); const regEx = /\n+(?=(?:(?!\"|\").)*\")/gs; const allPastedFields = pastedData.replaceAll(regEx, " ").split('\n').filter(el => el !== ''); // Rest of your code here. } Nota: si necesita conservar las líneas nuevas en cada campo, puede reemplazar las líneas nuevas con un marcador de posición; por ejemplo, .replaceAll(regEx,'{NEW_LINE}') . Luego, cuando analice el campo, puede reemplazarlo con una nueva línea - Ejemplo .replaceAll('{NEW_LINE}', '\n') .
Inspiración RegEx original aquí .
Divido por '\r\n'. y este trabajo para mí. las nuevas líneas dentro de la celda eran simplemente \n . este es mi codigo:
onPastingContacts(e) { const pastedData = e.clipboardData.getData('Text'); const allPastedFields = pastedData.split('\r\n').filter(el => el !== ''); allPastedFields.forEach(el => { const field = el.split('\t'); let element = { 'field1': field[0]?.replace(/\r/g, ''), 'field2': field[1]?.replace(/\r/g, ''), 'field3': field[2]?.replace(/\r/g, ''), 'field4': field[3]?.replace(/\r/g, ''), 'field5': field[4]?.replace(/\r/g, ''), 'field6': field[5]?.replace(/\r/g, '') }; Object.keys(element).forEach((key) => (element[key] == null) && delete element[key]); // remove empty fields from object Data.push(element) }); return {Data} },