Convertir archivo CSV a matriz en PHP

Olorunfemi Akinlua 20 junio 2023
  1. Utilice fopen() y fgetcsv() para convertir CSV a matriz en PHP
  2. Use el str_getcsv() para convertir CSV a matriz en PHP
  3. Use el array_map() para convertir CSV a Array en PHP
Convertir archivo CSV a matriz en PHP

Los archivos de valores separados por comas (CSV) son una gran parte de la canalización de datos. Independientemente del lenguaje de programación, su aplicación tiene un lugar para CSV.

Los archivos CSV son populares para almacenar datos en formato de fila y columna. Por lo tanto, las matrices son la estructura de datos perfecta para mantener sus valores cuando procesamos archivos CSV dentro de nuestra aplicación PHP.

En este artículo, detallaremos y le mostraremos las funciones integradas de PHP que pueden permitirnos leer y convertir CSV en una matriz en PHP.

Utilice fopen() y fgetcsv() para convertir CSV a matriz en PHP

Para esta sección y las otras dos secciones, usaremos un archivo CSV que contiene valores de vivienda estatales (state_housing_values.csv) con 51 filas y 4 columnas para mostrar cómo funcionan estas funciones.

Primero, necesitamos la función fopen() para abrir el archivo CSV y apuntarlo a la función fgetcsv() como primer argumento, con el resto de los argumentos opcionales. Los otros parámetros incluyen longitud, separador, recinto y escape.

Ahora, vamos a convertir el archivo CSV en una matriz.

$file = fopen('state_housing_values.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {
    var_dump($line);
}
fclose($file);

Producción :

array(4) {
  [0]=>
  string(5) "State"
  [1]=>
  string(5) "Price"
  [2]=>
  string(13) "1-year change"
  [3]=>
  string(15) "1-year forecast"
}
array(4) {
  [0]=>
  string(7) "Alabama"
  [1]=>
  string(7) "143,072"
  [2]=>
  string(3) "5.5"
  [3]=>
  string(4) "-1.1"
}
array(4) {
  [0]=>
  string(6) "Alaska"
  [1]=>
  string(7) "300,073"
  [2]=>
  string(4) "-2.3"
  [3]=>
  string(4) "-4.8"
}
array(4) {
  [0]=>
  string(7) "Arizona"
  [1]=>
  string(7) "277,574"
  [2]=>
  string(3) "7.5"
  [3]=>
  string(4) "-0.5"
}
array(4) {
  [0]=>
  string(8) "Arkansas"
  [1]=>
  string(7) "130,907"
  [2]=>
  string(3) "3.8"
  [3]=>
  string(4) "-1.7"
}
array(4) {
  [0]=>
  string(10) "California"
  [1]=>
  string(7) "578,267"
  [2]=>
  string(3) "4.4"
  [3]=>
  string(4) "-1.1"
}
...

Antes de continuar, podemos eliminar el encabezado, que podría no ser necesario en nuestra base de código PHP. Para hacerlo, simplemente podemos agregar $line = fgetcsv($file) antes del bucle while.

$file = fopen('state_housing_values.csv', 'r');
$line = fgetcsv($file);
while (($line = fgetcsv($file)) !== FALSE) {
    var_dump($line);
}
fclose($file);

Producción :

array(4) {
  [0]=>
  string(7) "Alabama"
  [1]=>
  string(7) "143,072"
  [2]=>
  string(3) "5.5"
  [3]=>
  string(4) "-1.1"
}
array(4) {
  [0]=>
  string(6) "Alaska"
  [1]=>
  string(7) "300,073"
  [2]=>
  string(4) "-2.3"
  [3]=>
  string(4) "-4.8"
}
...

Con esto, el encabezado ya no está en la matriz,

Es muy difícil trabajar con el formato de matriz anterior. Para que la matriz sea más funcional, necesitamos refactorizar el código y usar array_combine().

<?php

$filename = 'state_housing_values.csv';
$delimiter = ',';

if (file_exists($filename) || is_readable($filename)) {
    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE) {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
            if (!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    var_dump($data);
} else {
    error_log("Error reading file.");
}
?>

Producción :

array(50) {
  [0]=>
  array(4) {
    ["State"]=>
    string(7) "Alabama"
    ["Price"]=>
    string(7) "143,072"
    ["1-year change"]=>
    string(3) "5.5"
    ["1-year forecast"]=>
    string(4) "-1.1"
  }
  [1]=>
  array(4) {
    ["State"]=>
    string(6) "Alaska"
    ["Price"]=>
    string(7) "300,073"
    ["1-year change"]=>
    string(4) "-2.3"
    ["1-year forecast"]=>
    string(4) "-4.8"
  }
...

Hay casos en los que el delimitador no es una coma ,. Por lo tanto, necesitaremos especificar el delimitador.

Otros delimitadores podrían ser un punto y coma ;, un espacio " ", o un tabulador \t. Para especificar el delimitador dentro de la función, puede seguir el código a continuación.

$delimiter = ';'; // semi-colon
fgetcsv($handle, 1000, $delimiter)

Use el str_getcsv() para convertir CSV a matriz en PHP

Aquí, haremos uso de la función file() para procesar el CSV, recorreremos el puntero del archivo usando el bucle foreach y colocaremos cada valor dentro de la matriz $data a través de str_getcsv() función.

$data = array();
$lines = file('state_housing_values.csv', FILE_IGNORE_NEW_LINES);

foreach ($lines as $key => $value) {
    $data[$key] = str_getcsv($value);
}

print_r($data);

Producción :

Array
(
    [0] => Array
        (
            [0] => State
            [1] => Price
            [2] => 1-year change
            [3] => 1-year forecast
        )

    [1] => Array
        (
            [0] => Alabama
            [1] => 143,072
            [2] => 5.5
            [3] => -1.1
        )

    [2] => Array
        (
            [0] => Alaska
            [1] => 300,073
            [2] => -2.3
            [3] => -4.8
        )

    [3] => Array
        (
            [0] => Arizona
            [1] => 277,574
            [2] => 7.5
            [3] => -0.5
        )

    [4] => Array
        (
            [0] => Arkansas
            [1] => 130,907
            [2] => 3.8
            [3] => -1.7
        )

    [5] => Array
        (
            [0] => California
            [1] => 578,267
            [2] => 4.4
            [3] => -1.1
        )

    [6] => Array
        (
            [0] => Colorado
            [1] => 408,794
            [2] => 3.1
            [3] => -1.7
        )

    [7] => Array
        (
            [0] => Connecticut
            [1] => 259,855
            [2] => 1.4
            [3] => -2.3
        )

    [8] => Array
        (
            [0] => Delaware
            [1] => 257,521
            [2] => 0
            [3] => -2.9
        )

    [9] => Array
        (
            [0] => Florida
            [1] => 252,309
            [2] => 3.6
            [3] => -1.5
        )

    [10] => Array
        (
            [0] => Georgia
            [1] => 206,804
            [2] => 4.9
            [3] => -1.5
        )
...

Agregue algunos cambios al código anterior para eliminar el encabezado. Usaremos la declaración condicional if para eliminar la primera matriz que contiene el encabezado.

foreach ($lines as $key => $value) {
    if (!$key == 0) {
        $data[$key] = str_getcsv($value);
    }
}

print_r($data);

Producción :

Array
(
    [1] => Array
        (
            [0] => Alabama
            [1] => 143,072
            [2] => 5.5
            [3] => -1.1
        )
...

Use el array_map() para convertir CSV a Array en PHP

Los fragmentos de código anteriores usaban bucles o preprocesamiento para convertir CSV en una matriz. Sin embargo, existe un método mejor, más rápido y fácil de leer para convertir archivos CSV en una matriz dentro de PHP utilizando las funciones array_map() y file().

$csv = array_map('str_getcsv', file('state_housing_values.csv'));
print_r($csv);

Producción :

Array
(
    [0] => Array
        (
            [0] => State
            [1] => Price
            [2] => 1-year change
            [3] => 1-year forecast
        )

...

    [50] => Array
            (
                [0] => Wyoming
                [1] => 256,089
                [2] => 5.7
                [3] => -1.6
            )

)

Estas funciones pueden manejar archivos CSV con muchos valores y, para demostrarlo, utilizaremos la función array_map() en un archivo CSV que contiene datos de apalancamiento en 1857 filas y 17 columnas, y también eliminaremos el encabezado. de la matriz

$csv = array_map('str_getcsv', file('leverage.csv'));
unset($csv[0]);
print_r($csv);

La salida del código (que salió a los 0,257 segundos) se encuentra a continuación.

Array
(
    [1] => Array
        (
            [0] => 001300
            [1] => 20150331
            [2] => 2015
            [3] => 1
            [4] => INDL
            [5] => C
            [6] => D
            [7] => STD
            [8] => USD
            [9] => 2015Q1
            [10] => 2015Q1
            [11] => 45357.0000
            [12] => 781.7070
            [13] => 5661.0000
            [14] => 15432.0000
            [15] => A
            [16] => 104.3100
        )

...
    [1856] => Array
        (
            [0] => 252940
            [1] => 20171231
            [2] => 2017
            [3] => 3
            [4] => INDL
            [5] => C
            [6] => D
            [7] => STD
            [8] => USD
            [9] => 2017Q4
            [10] => 2017Q3
            [11] =>
            [12] =>
            [13] =>
            [14] =>
            [15] => A
            [16] => 7.2700
        )

)

Los archivos CSV están disponibles a continuación para jugar con el código.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Artículo relacionado - PHP CSV

Artículo relacionado - PHP Array