Estoy intentando crear una sola cadena a partir de una matriz de matrices, pero con una condición, los últimos 2 elementos (no se aplica a la primera fila) de la matriz deben estar en "".
La matriz se ve así:
const data = [ //( not applied to this row) [ "id", "group_name", "admin", "email_", "og.id", "created_by.email", "students", "namesids" ], //( applied to the following rows) [ "80", "Test group", "nilton.updated", "nilton@crowdform.co.uk", "22", "nilton@nilton.com", "nilton@nilton.com,pedro@com.com", "13,14,27" ], [ "18", "PRO Group", "", "", "22", "sys@stys.com", "", "13000" ], [ "10", "Test Group", "TEst", "Test@test.com", "22", "test.test@test.com", "", "" ] ] Detalles:
Los datos que no contienen nada también deben estar entre comillas. Lo que espero y lo que intenté hasta ahora:
esperado (esta es una cadena, el último carácter de cada línea es \n):
const this_is_a_string = " id,group_name,admin,email_,og.id,created_by.email,students,namesids 80,Test group,nilton.updated,nilton@crowdform.co.uk,22,nilton@nilton.com,"nilton@nilton.com,pedro@com.com","13,14,27" 10,Test Group,TEst,Test@test.com,22,test.test@test.com,"","" ... "Lo que intenté, no fue la respuesta correcta:
data.map(objects => { const newAr = objects.reduce((arr, values, i) => { arr = arr + ',' + values if (i === 6 || i ===7) return arr = arr + ',' + '"' + values + '"'; return arr; }, "") console.log(newAr.substring(1)); return; }) Si es posible, cree una función que pueda recibir los data como primer parámetro y una matriz de posición que debe estar entre comillas. Las matrices siempre tendrán el mismo tamaño que la primera, por eso sé las posiciones que deben estar entre comillas.
Para cada fila, use Array.prototype.slice() para separar los dos últimos elementos del resto.
Luego, se trata de asignar esas dos últimas entradas a los valores citados y volver a unir todo, separado por comas.
Luego, cada fila se puede unir en una sola cadena separada por líneas nuevas.
const data = [["id","group_name","admin","email_","og.id","created_by.email","students","namesids"],["80","Test group","nilton.updated","nilton@crowdform.co.uk","22","nilton@nilton.com","nilton@nilton.com,pedro@com.com","13,14,27"],["18","PRO Group","","","22","sys@stys.com","","13000"],["10","Test Group","TEst","Test@test.com","22","test.test@test.com","",""]]; const rowMapper = (row) => [...row.slice(0, -2), ...row.slice(-2).map((v) => `"${v}"`)].join(","); const [header, ...rows] = data; const csv = [header.join(","), ...rows.map(rowMapper)].join("\n"); console.log(csv);Como se menciona en los comentarios, también podría citar todos los valores, incluso los encabezados y escapar de las comillas incrustadas.
const csv = data .map((row) => row.map((v) => `"${v.replace(/"/g, '""')}"`).join(",")) .join("\n");