Leggere da un file CSV con PHP

File csv
In questo articolo vedremo come utilizzare Php per leggere i dati contenuti in un fil CSV per stamparli su una tabella HTML.
L’utility che creeremo potrebbe essere utile ad esempio per inserire all’interno di un sito statico, dellenews, o una serie di eventi, o qualsiasi cosa che possa essere aggiornata semplicemente aggiornando il file CSV, senza bisogno di installare pesanti CMS.

Un file CSV è in un semplice file di testo formattato secondo certe regole,compatibile con i principali programmi per la trattazione di fogli elettronici come Excel, il foglio di calcolo di open office.
Ogni riga contiene i dati che sono separati tra loro dal carattere “;”

Creiamo il file dati.csv con all’interno l’elenco (per esempio ) delle news su 4 colonne ad esempio (idRiga, data, news, autore) per avere una struttura simie a quella di un database.
Ci sono 2 modi per realizzare quanto detto.
Nel primo metodo useremo la funzione php fopen() per leggere dal file e split() per recuperare i singoli campi

I METODO
Quello che dobbiamo fare e’ semplicemente leggere ogni riga del file e poi suddividere le varie colonne, spezzando ogni colonna con il metodo

1
split(';', $riga)

che ritorna un array con tutti valori separati da “;”.
ad esempio se avessimo:

$riga="pippo;pluto;paperino";
$valori=split(';', $riga);

avremmo un array con i valori {pippo,pluto,paperino}

< ?php
print "<table border=1 width=90% >";
$fd= fopen ("dati.csv", "r"); 
$x=0; 
 
// Intestazione Tabella 
print "<tr>";
print "<td>ID</td>";
print "<td>Data</td>";
print "<td>News</td>";
print "<td>Autore</td>";
print "</tr>";
 
// News in archivio while (!feof ($fd)) { $riga=while (!feof ($fd))
{
   $riga=<strong>fgets</strong>($fd, 4096);
   if($riga!="")
   {
      $arr=<strong>split</strong>(';', $riga);
      print "<tr>";
      print "<td>".$arr[0]."</td>";
      print "<td>".$arr[1]."</td>";
      print "<td>".$arr[2]."</td>";
      print "<td>".$arr[3]."</td>";
      print "</tr>";
      $x++;
   }
}
print "";
fclose($fd);
?>

II METODO
Una funzione PHP molto interessante per il parsing dei file CSV è fgetcsv
Con questa funzione si possono leggere file in formato CSV e ottenere un array già formattato con i campi, da poter leggere riga per riga!
In questo modo evitiamo di dover usare la funzione split per diviere la riga.

vediamo l’esempio

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$file="dati.csv";
$delimiter = ",";
$echo = "<table>";  //variabile da stampare
//apro il file
if (($fp = fopen($file, "r")) !== false)
{
 //per ogni riga del file...
 while (($data = fgetcsv($fp, 1000, $delimiter)) !== false) {
 //...inserisco una riga nella tabella
 $echo .= "<tr>";
 foreach( $data as $el ) $echo .= "<td>".$el."</td>";
 $echo .= "</tr>";
 }
 fclose($fp);
}
 
//restituisco la tabella
$echo .= "</table>";
echo $echo;
}



About Mauro De Filippis 924 Articles
Laureato in Ingegneria Informatica nel 2008 presso l'Università degli Studi di Lecce con una tesi in Processi di Produzione Robotizzati dal titolo "Integrazione delle tecniche di progettazione del ciclo di lavorazione con programmazione della produzione”. Le mie attività principali sono : sviluppo di applicativi ANSI C per terminali POS basati su processori ARM Risc 32Bit con 2-4 MB di Ram (progettazione, sviluppo e test delle applicazioni ) sviluppo in ambiente .NET sviluppo Web in ambiente PHP, ASP Installazione, progettazione, utilizzo di Db MS SQL Server, Mysql, Acces , Oracle Da anni mi occupo di CMS Open Source, in particolare di Joomla e Wordpress. Mia è la Guida Wordpress 3.5, la Guida Joomla 2.5 , il Corso online Joomla! 2.5 ed il Corso online Wordpress Mi occupo anche di LMS in particolare di Moodle e Docebo. Google+ by Mauro De Filippis

12 Comments

  1. ciao,
    vorrei usare questo codice, magari prima in locale, però non funziona, mica potresti spiegare un pò meglio come usare il codice? magari postando anche un’esempio di csv

    grazie mille

    • Ciao, do per scontato che tu abbia installato un server web con php sul tuo pc e che il server sia attivo.

      Per quanto riguarda il primo metodo :
      nella directory root del webserver (se hai installato wamp di solito è c:\wamp\www\)
      crea il file index.php e copiaci dentro il primo pezzo di codice.
      Nella stessa cartella crea il dile dati.csv ( se vuoi usare un’altro nome o un’altro percorso cambia il nome file nella riga 3 del codice).
      All’interno del file inserisci le righe
      Le righe sono fatte così:

      1;10/11/2010;riga 1 di test;Mauro
      2;12/11/2010;”ciao ciao”;Pippo
      3;13/11/2010;altra riga;Giovanni
      4;11/11/2010;prova;Guest
      5;10/12/2010;”ciao ciao”;Mauro
      6;12/12/2010;”ciao ciao”;Autore
      7;13/12/2010;”ciao ciao”;Mauro

      se vuoi modificare il carattare separatore (ad esempio la virgola ‘,’ al posto del punto e virgola ‘;’) modifica la riga 19 del codice.
      Salvato il file csv
      per vedere lo script all’opera sul browser digita l’indirizzo http://127.0.0.1/ndex.php
      e dovresti vedere tutte le righe del file csv

  2. nel secondo metodo l’output restituito è separato da “;” per togliere questo fastidioso problema e impaginare perfettamente la tabella basta sostituire la variabile
    $delimiter = “,”;
    con
    $delimiter = “;”;
    e tutto magicamante funzionerà, poi si può iniziare a fare esperimenti come

    $file=”dati.csv”;
    $delimiter = “;”;
    $echo = “”; //variabile da stampare
    //apro il file
    if (($fp = fopen($file, “r”)) !== false)
    {
    //per ogni riga del file…
    while (($data = fgetcsv($fp, 1000, $delimiter)) !== false) {
    //…inserisco una riga nella tabella
    $echo .= “”;
    foreach( $data as $el ) $echo .= “”.$el.””;
    $echo .= “”;
    }
    fclose($fp);
    }

    //restituisco la tabella
    $echo .= “”;
    echo $echo;
    }

    //restituisco la tabella
    $echo .= “”;
    echo $echo;

    così le parole in output saranno colorate di rosa!

  3. Ciao,
    innanzitutto grazie del tutorial :-).
    Avrei un dubbio…
    ma se nel caso avessi l’ultima voce del mio file csv che vorrei fosse un link (tipo scaricare un pdf) come devo fare?….io ho utilizzato il metodo 2.
    grazie

  4. Ciao, grazie del tutorial , e fatto benissimo XD, volevo chiederti e se all’interno del mio file volessi cercare un campo ben preciso ad esempio : se voglio cercare l’autore “pippo ” all’interno del mio fil CSV e in output voglio avere l’intera riga con tutti i campi ovvero : 2;12/11/2010;”ciao ciao”;Pippo
    come dovrei scriverlo ??
    grazie in anticipo

  5. Buonasera, sto cercando di utilizzare lo script in questione. Ho un file csv in cui i dati dovrebbero essere formattati in tabelle di sei righe e 4 colonne.

    Ho adattato il codice come segue:
    [code]
    <?php
    $file="includes/quot_base.csv"; /* il mio file sorgente */
    $delimiter = ",";
    $echo = "”; //variabile da stampare
    //apro il file

    $fp = fopen($file, “r”);

    if ($fp !== false) {
    //per ogni riga del file…
    $data = fgetcsv($fp, 1000, $delimiter); /* dovrebbe creare un array di risultati */
    $quanti = count($data); /* vorrei contare le righe */
    while ($data <= $quanti) { /* finché non arriva all'ultima riga */
    //…inserisco una riga nella tabella
    $echo .= "”;
    foreach ($data as $el => $val) {
    $echo .= “”.$el.””;
    }
    $echo .= “”;
    fclose($fp);
    }

    //restituisco la tabella
    $echo .= “”;
    echo $echo;
    }

    //restituisco la tabella
    $echo .= “”;
    echo $echo;
    ?>
    [/code]

    Risultato: il vuoto pneumatico. Dov’è l’errore?
    Grazie

  6. <?php
    ob_start();
    $fd= fopen ("dati.csv", "r");
    $x=0;

    // Intestazione Tabella
    // News in archivio
    while (!feof ($fd))
    {
    $riga=fgets($fd, 4096);
    if($riga)
    {
    $arr=split(";", $riga);

    print $arr[0].";".$arr[2].";".$arr[20].";".$arr[3].";".$arr[5].";".$arr[1].";".$arr[21].";".$arr[9].";".$arr[6]."”;
    $x++;
    }
    }

    fclose($fd);
    ?>

Rispondi