¿Cómo convertir un archivo CSV a JSON y viceversa en JavaScript?

Los archivos CSV son un formato de archivo común que se utiliza para almacenar datos en forma de tabla. Pueden ser particularmente útiles cuando un usuario tiene la intención de descargar información estructurada de una manera que pueda abrir y leer fácilmente en su máquina local. Los archivos CSV son ideales para esto debido a su portabilidad y universalidad.

En este artículo, explicaremos cómo convertir objetos JavaScript JSON al formato de archivo CSV y viceversa. Este código no utiliza bibliotecas externas y, por lo tanto, funciona tanto en el navegador como en Node.js.

Conversión de JSON a CSV

Para convertir de JSON a CSV, primero debemos identificar los encabezados del archivo CSV. Para hacer esto, obtengamos una lista de claves presentes en cada uno de los objetos de JavaScript que se han pasado. Para obtener esta lista de claves, use el método `Object.keys()`.

Javascript

<script>
    const JSONToCSV = (objArray, keys) => {
        let csv = keys.join(',');
        objArray.forEach((row) => {
            let values = [];
            keys.forEach((key) => {
                values.push(row[key] || '');
            });
            csv += '\n' + values.join(',');
        });
        return csv;
    };
  
    const exampleJSON = [
        { 
            "date": 20210307, 
            "positives": 28756184, 
            "fatalities": 515148 
        },
        { 
            "date": 20210306, 
            "positives": 28714654, 
            "fatalities": 514309 
        },
        { 
            "date": 20210305, 
            "positives": 28654639, 
            "fatalities": 512629 
        },
        { 
            "date": 20210304, 
            "positives": 28585852, 
            "fatalities": 510408 
        },
        { 
            "date": 20210303, 
            "positives": 28520365, 
            "fatalities": 508665 
        },
        { 
            "date": 20210302, 
            "positives": 28453529, 
            "fatalities": 506216 
        },
        { 
            "date": 20210301, 
            "positives": 28399281, 
            "fatalities": 504488 
        }
    ];
    console.log(JSONToCSV(exampleJSON, 
        ['date', 'positives', 'fatalities']));
</script>

Este código se puede simplificar a:

Javascript

<script>
    const JSONToCSV = (objArray, keys) => [
        keys.join(','), ...objArray.map(
            row => keys.map(k => row[k] || '')
                .join(','))].join('\n');
  
    const exampleJSON = [
        {
            "date": 20210307,
            "positives": 28756184,
            "fatalities": 515148
        },
        {
            "date": 20210306,
            "positives": 28714654,
            "fatalities": 514309
        },
        {
            "date": 20210305,
            "positives": 28654639,
            "fatalities": 512629
        },
        {
            "date": 20210304,
            "positives": 28585852,
            "fatalities": 510408
        },
        {
            "date": 20210303,
            "positives": 28520365,
            "fatalities": 508665
        },
        {
            "date": 20210302,
            "positives": 28453529,
            "fatalities": 506216
        },
        {
            "date": 20210301,
            "positives": 28399281,
            "fatalities": 504488
        }
    ];
    console.log(JSONToCSV(exampleJSON,
        ['date', 'positives', 'fatalities']));
</script>

Producción:

date, positives, fatalities
20210307, 28756184, 515148
20210306, 28714654, 514309
20210305, 28654639, 512629
20210304, 28585852, 510408
20210303, 28520365, 508665
20210302, 28453529, 506216
20210301, 28399281, 504488

Conversión de CSV a JSON

Para convertir de CSV a JSON, primero identifique una lista de claves para cada objeto de JavaScript analizando los encabezados de CSV, luego agregue cada clave y valor a un nuevo objeto para cada fila de CSV.

Javascript

<script>
    const CSVToJSON = csv => {
        const lines = csv.split('\n');
        const keys = lines[0].split(',');
        return lines.slice(1).map(line => {
            return line.split(',').reduce((acc, cur, i) => {
                const toAdd = {};
                toAdd[keys[i]] = cur;
                return { ...acc, ...toAdd };
            }, {});
        });
    };
  
    const exampleCSV = `
            date,positives,fatalities
            20210307,28756184,515148
            20210306,28714654,514309
            20210305,28654639,512629
            20210304,28585852,510408
            20210303,28520365,508665
            20210302,28453529,506216
            20210301,28399281,504488`;
    console.log(CSVToJSON(exampleCSV));
</script>

Producción:

Publicación traducida automáticamente

Artículo escrito por xtrp y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *