Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 37 di 56
  • livello intermedio
Indice lezioni

Importare dati da file in formato CSV

Importare i dati contenuti in un file in formato CSV in un database MySQL con PHP.
Importare i dati contenuti in un file in formato CSV in un database MySQL con PHP.
Link copiato negli appunti

Se abbiamo l'esigenza di importare dati nel nostro database MySQL è probabile che la scelta del formato da utilizzare ricadrà su CSV, sia perché è molto comodo gestire dati in questo formato, sia perché è altrettanto comodo importarli.

Per quanto riguarda il primo aspetto possiamo ottenere i dati mediante un'esportazione tramite una procedura PHP, come abbiamo visto nella lezione precedente, ma possiamo generare un file CSV anche convertendo un file di Excel, opzione frequente quando il fornitore dei dati non è uno sviluppatore.

Una volta ottenuto il file CSV vediamo come importarlo. E' bene ricordare che è possibile caricare i dati nella tabella scelta direttamente da phpMyAdmin, l'interfaccia più popolare per l'amministrazione di MySQL cia Web. Una volta entrati nel database e selezionata la tabella di nostro interesse, andremo sul menu "Importa" e sceglieremo il nostro file, in questo caso è fondamentale selezionare correttamente le impostazioni relative al separatore e al delimitatore dei campi, un'opzione utile quando i dati del CSV e la tabella coincidono perfettamente nei nomi dei campi e nel formato dei dati.

Se questo non accade, per esempio perché nel CSV sono presenti soltanto alcuni campi della tabella oi formati sono differenti, come nel caso classico di date formattate per l'Italia da inserire in campo date, bisognerà pensare a qualcosa di più articolato tramite la mediazione di PHP.

I passi per riversare il contenuto del file CSV nella tabella saranno quindi i seguenti:

  • apriremo il file in lettura;
  • leggeremo ciascuna riga;
  • nel ciclo di lettura separeremo i "campi" del CSV;
  • prepareremo le variabili e procederemo con l'inserimento.

Il file csv

Immaginiamo di disporre di un file chiamato listanomi.csv e strutturato in questo modo:

lorenzo,de ambrosis,mail1@tin.it,10-01-2017
marco,bianchi,mail2@tin.it,11-01-2017
luca,verdi,mail3@tin.it,12-01-2017
andrea,rossi,mail4@tin.it,13-01-2017

Da notare la virgola come separatore del campo. Apriamo quindi il file in lettura:

ini_set('auto_detect_line_endings',TRUE);
$f = fopen('listanomi.csv','r');

Da notare che prima dell'apertura del file abbiamo inserito un comando per gestire correttamente la fine della riga per evitare sorprese che potrebbero verificarsi, per esempio, se lavoriamo su un Pc Windows e il CSV è stato generato su MAC.

A questo punto abbiamo il ciclo di lettura dei dati al termine del quale chiuderemo il file aperto e rimettiamo in ordine la configurazione dell'auto_detect_line_endings.

while ( ($data = fgetcsv($f) ) !== FALSE ) {
..
}
fclose($f);
ini_set('auto_detect_line_endings',FALSE);
?>

Il cuore dell'istruzione è il comando fgetcsv applicato ad ogni riga del nostro file che riversa nella variabile $data il contenuto della riga come array: ogni elemento dell'array conterrà un campo del CSV.

La query

Possiamo verificare il contenuto di questa variabile usando in fase di debug un'istruzione di questo tipo: print_r($data). In realtà la cosa che ci interessa è preparare le variabili per l'INSERT nella nostra tabella, quindi andremo a creare la connessione al database e un'istruzione SQL con i parametri che posizioneremo prima ma al di fuori del ciclo:

$host = 'localhost';
$mydatabase = 'corso';
$user = 'root';
$pass='';
try {
    $db = new PDO('mysql:host='.$host.';dbname='.$mydatabase, $user, $pass);
} catch (PDOException $e) {
    echo "Errore: " . $e->getMessage();
    die();
}
$sql = 'INSERT INTO utenti (nome, cognome, email, data) VALUES(:nome, :cognome, :email, :data)';
$stmt = $db->prepare($sql);

A questo punto prepariamo le nostre variabili predisponendole per l'inserimento:

$nome = $data[0];
$cognome = $data[1];
$email = $data[2];
$miadata = DateTime::createFromFormat('d-m-Y', $data[3]);
$miadataString = $miadata->format('Y-m-d');

A questo punto non resta che fare il bind dei parametri ed eseguire la query:

$stmt->bindParam(':nome', $nome, PDO::PARAM_STR);
$stmt->bindParam(':cognome', $cognome, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->bindParam(':data', $miadataString, PDO::PARAM_STR);
$stmt->execute();

I dati del CSV saranno finalmente all'interno el database.

Ti consigliamo anche