Un CSV es un archivo de valores separados por comas con extensión .csv, que permite guardar datos en un formato tabular. Aquí hay un artículo para convertir los datos de un archivo csv a una notación de objetos de JavaScript (JSON ) sin usar ningún paquete npm de terceros. La principal diferencia con respecto a la conversión normal es que los valores de cualquier fila pueden estar separados por comas y, como sabemos, las diferentes columnas también están separadas por comas.
En este enfoque, ingresaremos el contenido del archivo CSV en una array y dividiremos el contenido de la array en función de un delimitador. Todas las filas del CSV se convertirán en objetos JSON que se agregarán a la array resultante que luego se convertirá a JSON y se generará un archivo de salida JSON correspondiente.
Enfoque:
siga los pasos a continuación para lograr la solución:
- Lea el archivo csv usando el paquete fs npm predeterminado.
- Convierta los datos a String y divídalos en una array.
- Genere una array de encabezados.
- Para todas las filas n-1 restantes, haga lo siguiente:
- Cree un objeto vacío para agregarle valores de la fila actual.
- Declare una string str como valor de array actual para cambiar el delimitador y almacenar la string generada en una nueva string s.
- Si encontramos comillas de apertura («), mantenemos las comas como están; de lo contrario, las reemplazamos con la tubería «|»
- Siga agregando los caracteres que atravesamos a un String s.
- Divida la string usando el delimitador de tubería | y almacene los valores en una array de propiedades.
- Para cada encabezado, si el valor contiene varios datos separados por comas, lo almacenamos en forma de array; de lo contrario, se almacena directamente el valor.
- Agregue el objeto generado a nuestra array de resultados.
- Convierta la array resultante a json y genere el archivo de salida JSON.
Nombre de archivo: app.js
javascript
// Reading the file using default // fs npm package const fs = require("fs"); csv = fs.readFileSync("CSV_file.csv") // Convert the data to String and // split it in an array var array = csv.toString().split("\r"); // All the rows of the CSV will be // converted to JSON objects which // will be added to result in an array let result = []; // The array[0] contains all the // header columns so we store them // in headers array let headers = array[0].split(", ") // Since headers are separated, we // need to traverse remaining n-1 rows. for (let i = 1; i < array.length - 1; i++) { let obj = {} // Create an empty object to later add // values of the current row to it // Declare string str as current array // value to change the delimiter and // store the generated string in a new // string s let str = array[i] let s = '' // By Default, we get the comma separated // values of a cell in quotes " " so we // use flag to keep track of quotes and // split the string accordingly // If we encounter opening quote (") // then we keep commas as it is otherwise // we replace them with pipe | // We keep adding the characters we // traverse to a String s let flag = 0 for (let ch of str) { if (ch === '"' && flag === 0) { flag = 1 } else if (ch === '"' && flag == 1) flag = 0 if (ch === ', ' && flag === 0) ch = '|' if (ch !== '"') s += ch } // Split the string using pipe delimiter | // and store the values in a properties array let properties = s.split("|") // For each header, if the value contains // multiple comma separated data, then we // store it in the form of array otherwise // directly the value is stored for (let j in headers) { if (properties[j].includes(", ")) { obj[headers[j]] = properties[j] .split(", ").map(item => item.trim()) } else obj[headers[j]] = properties[j] } // Add the generated object to our // result array result.push(obj) } // Convert the resultant array to json and // generate the JSON output file. let json = JSON.stringify(result); fs.writeFileSync('output.json', json);
Aporte:
Producción: