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.

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.