CSV vers MYSQL en php
Transformation d’une ligne csv à une requête SQL, le script remplace toutes les entrées à chaque fois, il ne met pas à jour mais est facilement transformable (voir la variable $q
).
Attention :
- La table sql doit comporter les mêmes champs que le fichier csv
- Une instance PDO doit être préparée
Voici le script :
<?php
private $_normalizeChars = array(
'Š'=>'S', 'š'=>'s', 'Ð'=>'Dj','Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A',
'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I',
'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U',
'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss','à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a',
'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i',
'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u',
'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'ƒ'=>'f'
);
/**
* Transforme la variable en clé pour mysql
**/
private function toDatabaseKey($var) {
$var = utf8_encode($var); //encode pour strtr
$var = strtr($var, $this->_normalizeChars); //remplace accents
$var = preg_replace('/\s+/', '_', $var); //remplace espaces par _
$var = preg_replace('/[^\w\d_ -]/si', '', $var); //remplace les autres caractères
}
/**
* Simple fonction d'exécution de la requête sql
**/
private function execQuery($q) {
// Create a new query object.
$db = DB::getInstance();
try {
return $db->exec($q);
} catch (PDOException $e) {
echo $e->__toString();
}
}
/**
* Script de transformation de CSV vers MYSQL,
* le script remplace toutes les valeurs de la sql à chaque fois
*
* @param $csv : chemin vers le fichier csv
* @param $db_table_name : nom de la table
* @return nb_requetes
**/
private function CSVToDatabase($csv, $db_table_name) {
$db = DB::getInstance();
$fields = array();
if (($handle = fopen($csv, "r")) !== FALSE) {
$row = 0;
$nb_requetes = 0;
while (($data = fgetcsv($handle, filesize($csv), ";")) !== FALSE) {
//le séparateur csv peut varier ; ou ,
if ($row == 0)
{
//Definition des champs
$num = count($data);
for ($c=0; $c < $num; $c++)
$fields[$c] = $this->toDatabaseKey($data[$c]);
} else {
$num = count($data);
$way = "REPLACE"; //Peut être modifié par INSERT
$q = " INTO ".$db_table_name." (";
foreach ($fields as $key => $value)
$q .= ($key == $num - 1) ? $value . ')' : $value . ', ';
$q .= " VALUES (";
for ($c=0; $c < $num; $c++) {
$q .= "'".$db->quote(utf8_encode($data[$c]))."'";
if($c < $num - 1)
$q .= ", ";
}
$q .= ($q) ? ');' : '';
if($q) {
if($this->execQuery($way . $q))
$nb_requetes++;
else
return false;
}
}
$row++;
}
}
unlink($csv); //supression du fichier csv
return $nb_requetes;
}