Lenguaje PHP

Convertir CSV a JSON usando PHP

Convertir CSV a JSON usando PHP. El formato o extensión JSON es un formato ampliamente utilizado cuando se trabaja con el desarrollo de API. La mayoría de las respuestas de API existentes están en formato JSON.

Ahora, convertir el contenido de un fichero CSV a formato JSON es simple con el lenguaje PHP. En este artículo, veremos diferentes métodos para lograr esta conversión de manera rápida y sencilla.

Convertir CSV a JSON usando PHP

En las siguientes secciones, veremos dos ejemplos más de conversión de archivos CSV a JSON.

  • Primer método: Conversión rápida
  • Segundo método: Convertir CSV (encabezado) en un JSON (asociando el par columna=>valor)
  • Tercer método: Cargar archivo CSV y conviértalo en JSON

a) Primer método: Conversión rápida y simple

Ejemplo rápido y llamaremos al archivo ejemplo-rapido.php

<?php
//Llamamos al fichero CSV animales.csv
$csvFileContent= file_get_contents("animales.csv");
// Convierte el contenido del archivo CSV en una matriz lineal
$csvLineArray = explode("\n", $csvFileContent);
// La fila de formularios da como resultado un formato de matriz
$resultado = array_map("str_getcsv", $csvLineArray);
$jsonObject = json_encode($resultado);
// Imprimimos los valores convertidos s extension JSON
print_r($jsonObject);
?>

El ejemplo rápido anterior en PHP convierte el contenido del archivo CSV en JSON con unas pocas líneas de código.

  • Primero, lee el contenido del archivo .csv usando la función PHP file_get_contents().
  • Explota la fila CSV por la secuencia de escape de la nueva línea (\n).
  • Luego, itera la matriz lineal y lee los datos de línea de la fila CSV.
  • Finalmente, la matriz de filas CSV resultante se convierte a JSON mediante la función json_encode().

La iteración ocurre con una sola línea de código. Esta línea asigna la matriz para llamar a PHP str_getcsv para analizar y convertir las líneas CSV en una matriz.

Cuando vimos los métodos para leer un archivo CSV, creamos un ejemplo usando la función str_getcsv.

El siguiente archivo de entrada se guarda y se usa para este ejemplo de PHP.

CSV de entrada (animales.csv)

Id,Nombre,Tipo,Rol
1,Leon,Salvaje,Jefe
2,Tigre,Salvaje,CEO
3,Jaguar,Salvaje,"Desarrollador Senior"
4,Pantera,Salvaje,"Desarrollador Junior"
5,Gato,Domestico,Practicante

JSON de salida en el navegador web

Este ejemplo rápido de PHP muestra la siguiente salida JSON en el navegador.

[["Id","Nombre","Tipo","Rol"],
["1","Leon","Salvaje","Jefe"],
["2","Tigre","Salvaje","CEO"],
["3","Jaguar","Salvaje","Desarrollador Senior"],
["4","Pantera","Salvaje","Desarrollador Junior"],
["5","Gato","Domestico","Practicante"]]

Segundo método: Convierta CSV (encabezado) en un JSON (asociando columna => valor)

Este ejemplo utiliza una cadena CSV como entrada en lugar de un archivo.

  • Crea la matriz de columnas de encabezado al obtener la primera fila del archivo CSV.
  • Luego, el código itera las filas CSV desde la segunda fila en adelante. En cada iteración, asocia la columna de encabezado y la columna de datos iterados.
  • Este bucle prepara una matriz asociativa que contiene los datos CSV.
  • En el paso final, la función json_encode() convierte la matriz asociativa y la escribe en un archivo JSON de salida.

El fichero tendrá como nombre convertir-csv-cadena-a-json.php

<?php
$csvString = "Id,Nombre,Tipo,Rol
1,Leon,Salvaje,Jefe
2,Tigre,Salvaje,CEO
3,Jaguar,Salvaje,Desarrollador Senior
4, Pantera, Salvaje, Desarrollador Junior
5, Gato, Domestico, Practicante";

$lineContent = array_map("str_getcsv", explode("\n", $csvString));

$headers = $lineContent[0];
$jsonArray = array();
$rowCount = count($lineContent);
for ($i=1;$i<$rowCount;$i++) {
foreach ($lineContent[$i] as $key => $column) {
$jsonArray[$i][$headers[$key]] = $column;
}
}

header('Content-type: application/json; charset=UTF-8');
$animales = 'animales'.time().'.json';
$fp = fopen($animales, 'w');
fwrite($fp, json_encode($jsonArray, JSON_PRETTY_PRINT));
fclose($fp);

$data = json_encode($jsonArray, JSON_PRETTY_PRINT);
header("Content-disposition: attachment; filename=".$animales."");
header('Expires: 0'); //No caching allowed
header('Cache-Control: must-revalidate');
header('Content-Length: ' . strlen($data));
file_put_contents('php://output', $data);
// Revise la carpeta del script para visualizar el json creado
?>

Salida: el archivo animales.json

Esta es la salida escrita en el archivo animales.json a través de este programa PHP.

{
"1": {
"Id": "1",
"Nombre": "Leon",
"Tipo": "Salvaje",
"Rol": "Jefe"
},
"2": {
"Id": "2",
"Nombre": "Tigre",
"Tipo": "Salvaje",
"Rol": "CEO"
},
"3": {
"Id": "3",
"Nombre": "Jaguar",
"Tipo": "Salvaje",
"Rol": "Desarrollador Senior"
},
"4": {
"Id": "4",
"Nombre": " Pantera",
"Tipo": " Salvaje",
"Rol": " Desarrollador Junior"
},
"5": {
"Id": "5",
"Nombre": " Gato",
"Tipo": " Domestico",
"Rol": " Practicante"
}
}

Tercer método: Cargar archivo CSV y conviértalo en JSON

En lugar de utilizar una entrada CSV fija asignada a un programa, este código permite a los usuarios elegir el archivo CSV.

Este código muestra un formulario HTML con una entrada de archivo para cargar el archivo CSV de entrada.
Una vez cargado, el script PHP leerá el contenido del archivo CSV, preparará la matriz y formará la salida JSON.

A continuación, veremos el script del fichero subir-y-convertir-csv-a-json.php

<?php
if (isset($_POST["convertir"])) {
if ($_FILES['csv_file_input']['name']) {
$ext = pathinfo($_FILES['csv_file_input']['name'], PATHINFO_EXTENSION);
if ($ext == 'csv') {
$jsonOutput = array();
$csvFileContent = file_get_contents($_FILES['csv_file_input']['tmp_name']);
$result = array_map("str_getcsv", explode("\n", $csvFileContent));
$header = $result[0];
$recordCount = count($result);
for ($i = 1; $i < $recordCount; $i++) {
// Asocia los datos con el índice de cadena en la matriz de encabezado
$data = array_combine($header, $result[$i]);
$jsonOutput[$i] = $data;
}
header('Content-disposition: attachment; filename=output.json');
header('Content-type: application/json');
echo json_encode($jsonOutput);
exit();
} else {
$error = 'Extension de archivo invalido ';
}
} else {
$error = 'CSV Invalido y/o vacio';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Convertir CSV a JSON</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container"> <a class="navbar-brand" href="#">BaulPHP</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExample07" aria-controls="navbarsExample07" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button>
<div class="collapse navbar-collapse" id="navbarsExample07">
<ul class="navbar-nav mr-auto">
<li class="nav-item active"> <a class="nav-link" href="#">Portada <span class="sr-only">(current)</span></a> </li>
</ul>
</div>
</div>
</nav>
<hr>
<div class="container">
<div class="card">
<div class="card-header bg-primary text-white"> Cargar y convertir CSV a JSON </div>
<div class="card-body">
<form name="frmUpload" method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-6">
<div class="input-group">
<div class="custom-file">
<input type="file" class="custom-file-input" id="inputGroupFile04" aria-describedby="inputGroupFileAddon04" name="csv_file_input" accept=".csv">
<label class="custom-file-label" for="inputGroupFile04">Cargar archivo CSV</label>
</div>
<div class="input-group-append"> </div>
</div>
</div>
</div>

<div class="form-group">
<div class="col-md-6">
<button class="btn btn-primary" name="convertir">Convertir a CSV y Descargar</button>
</div>
</div>
<div class="form-group">
<div class="col-md-6">
<?php
if (!empty($error))
{
?>
<div class="alert alert-danger" role="alert"> <?php echo $error; ?> </div>
<?php
}
?>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bs-custom-file-input/dist/bs-custom-file-input.min.js"></script>
<script>
bsCustomFileInput.init()

var btn = document.getElementById('btnResetForm')
var form = document.querySelector('form')
btn.addEventListener('click', function() {
form.reset()
})
</script>
</body>
</html>

Producción:

Este programa escribe el JSON de salida en un archivo y lo descarga automáticamente al navegador.

Nota: Ambos métodos 2 y 3 requieren la entrada de CSV con una fila de columna de encabezado para obtener buenos resultados.

Cargar y convertir de CSV a JSON
Cargar y convertir de CSV a JSON

Cuarta forma: Leer y convertir a JSON

Otra forma más sencilla es declarar el CSV y obtener los valores a través de la función file_get_contents()

// Declaramos un fochero CSV existente en el disco
$file="animales.csv";
$csv= file_get_contents($file);
$array = array_map("str_getcsv", explode("\n", $csv));
$json = json_encode($array);
print_r($json);

Quinta forma: Usando ciclo Foreach

Usaremos un fichero de tipo CSV para convertirlo a extensión JSON y el fichero tendrá como nombre animales.csv y su contenido será el siguiente.

Id,Nombre,Tipo,Rol
1,Leon,Salvaje,Jefe
2,Tigre,Salvaje,CEO
3,Jaguar,Salvaje,"Desarrollador Senior"
4,Pantera,Salvaje,"Desarrollador Junior"
5,Gato,Domestico,Practicante

Crear fichero PHP para convertir de CSV a JSON

Para convertir con nombre de columna, así es como debe de hacerce. Por lo tanto, vamos a crea un fichero llamado csv2json.php y dentro de este archivo contendra las siguientes lineas de codigo.

<?php
if (($handle = fopen("animales.csv", "r")) !== FALSE) {
$csvs = [];
while(! feof($handle)) {
$csvs[] = fgetcsv($handle);
}
$datas = [];
$column_names = [];
foreach ($csvs[0] as $single_csv) {
$column_names[] = $single_csv;
}
foreach ($csvs as $key => $csv) {
if ($key === 0) {
continue;
}
foreach ($column_names as $column_key => $column_name) {
$datas[$key-1][$column_name] = $csv[$column_key];
}
}
$json = json_encode($datas);
fclose($handle);
print_r($json);
}

Resultado de salida en el navegador

[
{
"Id":"1",
"Nombre":"Leon",
"Tipo":"Salvaje",
"Rol":"Jefe"
},
{
"Id":"2",
"Nombre":"Tigre",
"Tipo":"Salvaje",
"Rol":"CEO"},
{
"Id":"3",
"Nombre":"Jaguar",
"Tipo":"Salvaje",
"Rol":"Desarrollador Senior"
},
{
"Id":"4",
"Nombre":"Pantera",
"Tipo":"Salvaje",
"Rol":"Desarrollador Junior"
},
{
"Id":"5",
"Nombre":"Gato",
"Tipo":"Domestico",
"Rol":"Practicante"
}
]

Sexto forma: Usando función PHP

En pasos anteriores hemos aprendido a convertir de extensión CSV a JSON de varias maneras, en esta ocasión para optimizar nuestros códigos usaremos una función PHP con nombre personalizada. Veamos el código.

<?php
// FUnción para convertir de CSV a JSON
function csvtojson($file,$delimiter)
{
if (($handle = fopen($file, "r")) === false)
{
die("can't open the file.");
}

$csv_headers = fgetcsv($handle, 4000, $delimiter);
$csv_json = array();

while ($row = fgetcsv($handle, 4000, $delimiter))
{
$csv_json[] = array_combine($csv_headers, $row);
}

fclose($handle);
return json_encode($csv_json);
}

// LLamamos a un fichero CSV existente haciendo uso de la función creada
$jsonresult = csvtojson("./animales.csv", ",");

//Impresion de la conversion en el navegador
echo $jsonresult;

Conclusiones y recomendaciones

En este articulo hemos aprendido a convertir de CSV a formato JSON. Sin embargo, también hemos aprendido a cargar un fichero CSV y procesarlo a JSON.

Además, para obtener un proceso dinámico hemos aprendido a crear una función dinámica para lograr el objetivo final que es obtener un JSON a partir de un fichero CSV.

Nestor Tapia

Bloggero, amante de la programación PHP, innovador y me fascina compartir información. Desde que conocí el entorno informatico y el internet me llamó la atención la programación, Por tal motivo he creado mi blog BAULPHP.COM para compartir mis experiencias con todos ustedes. ¡Gracias por leerme!.

Deja una respuesta

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

Botón volver arriba
Esta web utiliza cookies propias para su correcto funcionamiento. Contiene enlaces a sitios web de terceros con políticas de privacidad ajenas que podrás aceptar o no cuando accedas a ellos. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad