Skip to content

Instantly share code, notes, and snippets.

@soyuka
Last active December 28, 2016 11:36
Show Gist options
  • Save soyuka/6697373 to your computer and use it in GitHub Desktop.
Save soyuka/6697373 to your computer and use it in GitHub Desktop.
CSV to SQL database Create a table according to the csv keys and put the csv content in it To be improved !
<?php
set_time_limit(0);
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'
);
//CSV TO Database
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
$var = strtolower(utf8_decode($var));
return $var;
}
private function escape($text)
{
if (is_int($text) || is_float($text))
{
return $text;
}
$text = str_replace("'", "''", $text);
return addcslashes($text, "\000\n\r\\\032");
}
private function CSVToDatabase($csv_path, $db_table_name, $prefix = null, $way = 'REPLACE') {
$fields = array();
$table_name = $prefix === null ? $db_table_name : $prefix . '_'. $db_table_name;
//Could add an option to truncate table first
/*$this->execQuery('TRUNCATE #__vehicules_options_id') or die('Impossible de vider la table options_id');*/
if (($handle = fopen($csv_path, "r")) !== FALSE) {
$row = 0;
$nb_requetes = 0;
while (($data = fgetcsv($handle, filesize($csv_path), ";")) !== FALSE) {
if ($row == 0)
{
//Definition des champs
$num = count($data);
for ($c=0; $c < $num; $c++)
$fields[$c] = $this->toDatabaseKey($data[$c]);
$sql = "CREATE TABLE IF NOT EXISTS ".$table_name." (id_".$db_table_name." INT not null AUTO_INCREMENT, ";
foreach ($fields as $key => $field)
$sql .= $field . " VARCHAR (255) null, ";
$sql .= " PRIMARY KEY (id_".$db_table_name."))";
$this->execSQL($sql);
} else {
$num = count($data);
$q = " INTO ".$table_name." (";
foreach ($fields as $key => $value) {
$q .= ($key == $num - 1) ? $value . ')' : $value . ', ';
}
$q .= " VALUES (";
for ($c=0; $c < $num; $c++) {
$q .= "'".$this->escape(utf8_encode($data[$c]))."'";
if($c < $num - 1)
$q .= ", ";
}
$q .= ($q) ? ');' : '';
if($q) {
if($this->execSQL($way . $q))
$nb_requetes++;
}
}
$row++;
}
} else {
$this->displayError('Fichier non compatible');
}
unset($data);
unset($fields);
return $nb_requetes;
}
private function execSQL($sql) {
$db = Db::getInstance();
return $db->Execute($sql);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment