File CSV: cosa sono e come gestirli in PHP

File CSV: le funzioni PHP per gestirli

Nelle guide precedenti dedicate alla gestione di file abbiamo analizzato le funzioni che ci consentono di manipolare semplici file di testo. Capita spesso però di dover gestire tipologie di file differenti da un file .txt, tra cui: file CSV, file JSON, file XML.

In questa guida ci concentriamo sulle funzioni che il linguaggio offre per leggere e scrivere dati su file CSV.

Cosa sono i file CSV

L'acronimo CSV sta per Comma-Separated Values e, come dice il nome stesso è un formato di file dove i dati sono un elenco di valori separati da una virgola. Viene utilizzato per importare ed esportare tabelle di dati.

In questo formato, ogni riga della tabella è rappresentata da una linea di testo, che a sua volta è divisa in campi (le singole colonne) separati da un apposito carattere separatore, ciascuno dei quali rappresenta un valore.

La seguente tabella di esempio

Nome Cognome Città
Mario Rossi Roma
John O'Really New York
Angelica Ramos London

può essere rappresentata in formato CSV in questo modo

Mario;Rossi;Roma
John;O'Really;New York
Angelica;Ramos;London

In generale, in un file CSV si dovrebbero rispettare le seguenti regole:

  1. Separare i campi tramite punto e virgola.
  2. Se i campi contengono virgole o punto e virgole racchiuderli tra doppi apici.
  3. Separare le righe con un a capo (\n);
  4. Non lasciare spazi prima e dopo i campi.
  5. Se il campo presenta un carattere di doppio apice racchiuderlo tra doppi apici: " diventa "".

I file CSV hanno estensione .csv e vengono utilizzati spesso nei fogli di calcolo elettronici come ad esempio Microsoft Excel o LibreOffice Calc.

Per quanto riguarda il separatore non esiste uno standard comune: nei paesi anglosassoni viene utilizzata la virgola, mentre in Italia e altri paesi latini il punto e virgola.

Creare un file CSV

Per creare o scrivere un file CSV in PHP è possibile utilizzare la funzione fputcsv() che prende come argomenti il puntatore al file e un array di stringhe da scrivere nel file.

La funzione restituisce il numero di byte scritti oppure false in caso di errore.

Di seguito è mostrato un esempio di utilizzo

<?php
$filename = 'users.csv';
$users = [
    ['Cristiano', 'Ronaldo', 'Portogallo'],
    ['Gonzalo', 'Higuain', 'Argentina'],
    ['Giorgio', 'Chiellini', 'Italia']
];

$handler = fopen($filename, 'w');

foreach($users as $user) {
    fputcsv($handler, $user, ';');
}

fclose($handler);

Tramite un foreach scriviamo nel file tutti gli elementi dell'array $users, separando i valori tramite il punto e virgola (riga 12).

È possibile specificare un terzo parametro (opzionale) della funzione, ossia il carattere delimitatore. Di default è la virgola, mentre nell'esempio abbiamo utilizzato il punto e virgola.

Leggere un file CSV

Leggere un file CSV è altrettanto semplice. PHP mette a disposizione la funzione fgetcsv() che preso un puntatore al file restituisce una riga letta dal file in questione oppure false.

Tramite un ciclo while possiamo quindi leggere l'intero contenuto di un file CSV. Vediamolo con un esempio

<?php
$filename = 'users.csv';

$handler = fopen($filename, 'r');

while($data = fgetcsv($handler)) {
    $users[] = implode('', $data);
}

fclose($handler);

print_r($users);

/* Output

Array
(
    [0] => Cristiano;Ronaldo;Portogallo
    [1] => Gonzalo;Higuain;Argentina
    [2] => Giorgio;Chiellini;Italia
)

*/

Leggere una stringa CSV

PHP consente di leggere anche una singola stringa CSV tramite la funzione str_getcsv()

<?php
$values = '10,89,100,34,15';

$csv = str_getcsv($values);

print_r($csv);

/* Output

Array
(
    [0] => 10
    [1] => 89
    [2] => 100
    [3] => 34
    [4] => 15
)

*/

Nota: nell'esempio precedente avremmo ottenuto lo stesso risultato utilizzando la funzione di stringa explode() che restituisce un array contenente i pezzi della stringa esplosi tramite il carattere separatore.