Home>Guide>Come leggere un file CSV con PHP

Come leggere un file CSV con PHP


Come leggere un file CSV con PHP

Leggere un file CSV con PHP è un’operazione sempre molto diffusa, basti pensare ad esempio alla lettura di un file feed o di un file di scambio con software gestionali. Interessante, vero? Ecco un tutorial per imparare a realizzare uno script PHP in grado leggere i dati di un file CSV, in cui prenderemo come esempio un file feed di prodotti da importare in un ipotetico e-commerce.

  • Leggi l'articolo, ti bastano solo 1 minuto, 17 secondi
    Sei di fretta? Scarica il PDF e consultalo quando vuoi!

Introduzione e scopo

Prima di iniziare, un piccolo preambolo: utilizzeremo come detto un file feed semplificato di prodotti in formato CSV, ipotizzando che contenga i seguenti dati, colonna per colonna:

  • ID prodotto
  • Nome prodotto
  • Prezzo
  • Quantità

Lo scopo dello script è di prelevare il file, leggerlo ed elaborare i dati in modo da poterli poi lavorare a proprio piacimento, come ad esempio, inserirli in un database.


Preparazione e controlli

Il primo passo consiste nel leggere il file che bisognerà lavorare. Per comodità, creiamo qualche variabile con nome del file e percorso locale da cui prelevarlo:

<?php
// Nome del file
$filename = 'products.csv';

// Percorso da cui prelevare il file
$path = 'data/';

// File completo di percorso
$file = $path . $filename;

Prima di procedere con la lettura vera e propria, consiglio sempre di inserire qualche controllo per evitare eventuali sgradevoli errori di esecuzione:

<?php
// Controllo se il file è leggibile
if ( ! is_readable( $file ) ) {
	die( 'Il file non è leggibile oppure non esiste!' );
}

Con queste poche righe, hai la possibilità di controllare se il file effettivamente esiste e se è leggibile (potrebbe non avere i permessi di lettura), in caso contrario lo script si interrompe visualizzando il messaggio di errore.


Importare il file CSV

Ora leggiamo il file e prepariamoci a lavorarlo:

<?php
// Leggo il contenuto del file
$rows = file( $file );

La funzione file( $file );, nativa di PHP a partire dalla versione 4, legge l’intero file passato come parametro e lo inserisce in un array, riga per riga. Comodo, vero?

Ecco cosa conterrà la variabile $rows dopo l’ultima istruzione:

// Contenuto della variabile $rows
Array
(
    [0] => ID;Name;Price;Quantity
    [1] => 44;V-Neck T-Shirt;33;0
    [2] => 45;Hoodie;21;0
    [3] => 46;Hoodie with Logo;45;2
    [4] => 47;T-Shirt;18;31
    [5] => 48;Beanie;20;45
    [6] => 58;Belt;65;32
    [7] => 60;Cap;18;9
    [8] => 62;Sunglasses;90;10
    [9] => 64;Hoodie with Pocket;45;0
    [10] => 66;Hoodie with Zipper;45;1
    [11] => 68;Long Sleeve Tee;25;44
    [12] => 70;Polo;20;12
    [13] => 73;Album;15;45
    [14] => 75;Single;3;33
    [15] => 76;V-Neck T-Shirt - Red;20;3
    [16] => 77;V-Neck T-Shirt - Green;20;18
    [17] => 78;V-Neck T-Shirt - Blue;15;4
    [18] => 79;Hoodie - Red, No;45;20
    [19] => 80;Hoodie - Green, No;45;4
    [20] => 81;Hoodie - Blue, No;45;0
    [21] => 83;T-Shirt with Logo;18;1
    [22] => 85;Beanie with Logo;20;1
    [23] => 87;Logo Collection;12;23
    [24] => 89;WordPress Pennant;11;31
    [25] => 90;Hoodie - Blue, Yes;45;15
)

Leggere il contenuto del file CSV

Ora che abbiamo un array con tutte le righe del file, non ci resta che scorrerlo. Naturalmente, come visto nel precedente paragrafo, ogni riga contiene una unica stringa composta dal contenuto delle varie colonne del file. Ma come fare per separarle ed ottenere i singoli valori? Semplice!

Riflettiamoci un attimo: un file CSV (acronimo di comma-separated values, valori separati da virgola) è sostanzialmente un file di testo che rappresenta i dati di una tabella.

Ogni file CSV, ha sempre un separatore di colonna, solitamente la virgola (,) oppure il punto e virgola (;), ma è possibile definire un separatore di colonna arbitrario. Ovviamente, prima di poter leggere il file, è necessario conoscere il separatore utilizzato dal CSV che andrai a leggere.

Ipotizzando che sia il punto e virgola (;), avremo:

<?php
// Scorro l'array contenente le righe del file
foreach ( $rows as $row ) {
	// Separo le colonne
	$columns = explode( ';', $row );
}

Utilizzando la funzione nativa di PHP explode( $delimiter, $string );, avremo un array di stringhe, ognuna delle quali è una sottostringa di $string ottenuta dividendola considerando il delimitatore di stringhe. Confuso? Effettivamente è più facile a farsi che a dirsi…

Ecco un esempio: consideriamo una ipotetica stringa con delimitatore (;) proveniente dal nostro file CSV:

[3] => 46;Hoodie with Logo;45;2

con l’operazione:

$columns = explode( ‘;’, $string );

otterremo:

// Contenuto dell'array $columns, relativo alla riga 3
Array
(
    [0] => 46
    [1] => Hoodie with Logo
    [2] => 45
    [3] => 2

)

A questo punto, tutti i dati relativi ai prodotti contenuti nel file CSV sono normalizzati e pronti per essere utilizzati come meglio credi!


In conclusione, lo script completo

Per fare ulteriore chiarezza, mettiamo un po’ di ordine! Ecco lo script completo da utilizzare per leggere il contenuto di un file CSV, come nel caso in esempio un feed di prodotti:

<?php
// Nome del file
$filename = 'products.csv';

// Percorso da cui prelevare il file
$path = 'data/';

// File completo di percorso
$file = $path . $filename;

// Controllo se il file è leggibile
if ( ! is_readable( $file ) ) {
	die( 'Il file non è leggibile oppure non esiste!' );
}

// Leggo il contenuto del file
$rows = file( $file );

// Scorro l'array contenente le righe del file
foreach ( $rows as $row ) {
	// Separo le colonne
	$columns = explode( ';', $row );

	/* QUI IL CODICE CHE OCCORRE PER LAVORARE I DATI */
}


Ti è piaciuto questo articolo? Regalami un click per ripagarmi dello sforzo



Code4Life ti è stato utile? Sostienici con una donazione!

Dona con PayPal

Hai trovato interessante l’articolo? Allora ti consiglio di leggere:

Come aggiungere gli attributi prev e next

Come aggiungere gli attributi prev e next


Ecco un semplice trucchetto che può aiutare il tuo sito a “piacere di più” ai motori di ricerca: gli attributi rel="prev" e rel="next".

Oppure cerca tra gli articoli correlati


E tu cosa ne pensi? Condividi la tua opinione e discutiamone insieme
La tua email non sarà resa pubblico o utilizzata per inviarti spam, te lo prometto

Iscrivimi alla newsletter per ricevere news ed aggiornamenti
Utilizziamo piattaforme di terze parti per l’invio di newsletter. (Privacy Policy)
Tienimi aggiornato su questo articolo
Ricevi una email di notifica quando qualcuno scriverà un commento a questo articolo. (Privacy Policy)
Ricorda i miei dati per la prossima volta che scriverò un commento
Il tuo nome e la tua email verranno salvati in un cookie in questo browser. (Privacy Policy)