batch/1.1/old/loadCSV.php

222 lines
6.9 KiB
PHP
Raw Normal View History

#!/usr/bin/php -c/var/www/batch/config/php_batch_sd.ini
<?php
error_reporting(E_ALL ^ E_NOTICE);
2013-06-19 08:24:49 +00:00
/** @todo Si MAJ en annule et remplace pr<EFBFBD>voir les manips SQL suivantes :
** Cr<EFBFBD>ation d'une table insee.tmp sans aucun index
** A la fin du chargement construire les index
** Si pas d'erreur :
** 1. detruire insee
** 2. Renommer insee.tmp en insee
**/
set_time_limit(0);
$heureDebut=TIME_LISIBLE;
$dateJour=DATE;
$dateJourFormat=substr(DATETIME,0,4).'-'.substr(DATETIME,4,2).'-'.substr(DATETIME,6,2);
$db_name=$db_table='';
$j=0;
$dropBefore=false;
$argv=$_SERVER['argv'];
if ($_SERVER['argc']==1) die('Usage : '.basename($argv[0]). " [OPTION]... FICHIER
2013-06-19 08:24:49 +00:00
Charger un fichier CSV dans une base de donn<EFBFBD>es avec cr<EFBFBD>ation de la table qui aura le nom du fichier charg<EFBFBD>..
Options disponibles:
Les arguments obligatoires pour les options de formes longues le sont aussi
pour les options de formes courtes.
2013-06-19 08:24:49 +00:00
-s=CHAR s<EFBFBD>parateur de champs (virgule, point-virgule*, /t=TAB, /p=|, etc...)
-c=CHAR caract<EFBFBD>re encadrant les zones alphanum<EFBFBD>riques (inop<EFBFBD>rationnel)
-d=nom_bdd Nom de la base de donn<EFBFBD>es
-t=nom_table Nom de la table
2013-06-19 08:24:49 +00:00
-e D<EFBFBD>truire la table si elle existe d<EFBFBD>j<EFBFBD>
2013-06-19 08:24:49 +00:00
(*): Valeurs par d<EFBFBD>faut !
");
for ($i=1; isset($argv[$i]); $i++) {
if (substr($argv[$i],0,1)=='-') {
switch (substr($argv[$i],1,1)) {
case 's': $separator=substr($argv[$i],3); break;
case 'c': $chaine=substr($argv[$i],3); break;
case 'd': $db_name=substr($argv[$i],3); break;
case 't': $db_table=substr($argv[$i],3); break;
case 'e': $dropBefore=true; break;
default: die('Option '. $argv[$i] . " inconnue !".EOL);
}
} else {
$fichier_csv[$j]=$argv[$i];
$j++;
}
}
2013-06-19 08:24:49 +00:00
if ($db_name=='') die("Base de donn<6E>es non communiqu<71>e !".EOL);
$iDb=new WDB($db_name);
if ($separator=='/t') {
$separator="\t";
2013-06-19 08:24:49 +00:00
echo "s<EFBFBD>parateur = TAB\n";
} else if ($separator=='/p') {
$separator='|';
2013-06-19 08:24:49 +00:00
echo "s<EFBFBD>parateur = PIPE\n";
} elseif (!isset($separator) || $separator=='') {
$separator=';';
2013-06-19 08:24:49 +00:00
echo "s<EFBFBD>parateur = '$separator'\n";
}
else
2013-06-19 08:24:49 +00:00
echo "s<EFBFBD>parateur = '$separator'\n";
2013-06-19 08:24:49 +00:00
// Mise <20> jour de la table PARAM
// -----------------------------
2013-06-19 08:24:49 +00:00
// 2 - pour la date et l'heure d'ex<65>cution du traitement en cours
/* $tabDataToUpdate=array('VALEUR'=>DATETIME,
'CLE'=>'INSEE_MAJ_ENCOURS');
$iparam->setParamValeur($tabDataToUpdate);
*/
2013-06-19 08:24:49 +00:00
echo date ('Y/m/d - H:i:s') . " - D<>but du traitement".EOL;
flush();
for ($nbFichiers=0; isset($fichier_csv[$nbFichiers]); $nbFichiers++)
{
if ($db_table=='')
$nom_table=str_replace('.csv', '', str_replace('.txt', '', basename($fichier_csv[$nbFichiers])));
else
$nom_table=$db_table;
$comment='Chargement de fichier CSV';
$fp=fopen($fichier_csv[$nbFichiers], 'r');
if (!$fp) {
echo date ('Y/m/d - H:i:s')." - Impossible d'ouvrir le fichier : ".$fichier_csv[$nbFichiers]." !".EOL;
/* $tabDataToUpdate=array( 'NUM'=>$numScript,
'DATE_JOUR'=>$dateJour,
'HEURE_DEBUT'=>$heureDebut,
'HEURE_FIN'=>$heureFin,
'CODE_RETOUR'=>0,
'NB_MAIL'=>1,
2013-06-19 08:24:49 +00:00
'RESUME_EXEC'=>"Impossible d'ouvrir le fichier n<>$nbFichiers <20> traiter : $nomFichier.");*/
echo date ('Y/m/d - H:i:s') . " - Fin du traitement".EOL;
exit();
}
$nbLignes=0;
2013-06-19 08:24:49 +00:00
echo date ('Y/m/d - H:i:s')." - D<>but du traitement du fichier ". $fichier_csv[$nbFichiers] ."...".EOL;
flush();
while (($data = fgetcsv($fp, 3000, $separator)) !== FALSE)
{
//echo "\nLigne #$nbLignes:\n";
//print_r($data);
$nbLignes++;
if ($nbLignes==1)
2013-06-19 08:24:49 +00:00
{ // L'ent<6E>te contient la structure du fichier
// On compte le nombre de colonnes du fichier
$nbColonnes=count($data);
$sql="CREATE TABLE IF NOT EXISTS `$nom_table` (";
for($i=0; $i<$nbColonnes; $i++) {
$sql.='`'.$data[$i].'` LONGTEXT,';
$tabTailles[$i]=0;
$champ[$i]=$data[$i];
}
2013-06-19 08:24:49 +00:00
$sql=substr($sql,0,strlen($sql)-1); // Retrait de la derni<6E>re virgule
//$sql.="NOM LONGTEXT, PRENOM LONGTEXT, NUSAGE LONGTEXT) TYPE = MYISAM COMMENT = '$comment'";
$sql.=") ENGINE = MYISAM COMMENT = '$comment'";
//echo $sql;
if ($dropBefore)
$iDb->query("DROP TABLE IF EXISTS `$nom_table`");
if ($iDb->query($sql))
2013-06-19 08:24:49 +00:00
echo date ('Y/m/d - H:i:s')." - Cr<43>ation de la table $nom_table OK...".EOL;
else {
echo $iDb->getLastError().EOL;
2013-06-19 08:24:49 +00:00
die(date ('Y/m/d - H:i:s')." - Impossible de cr<63>er la table $nom_table !".EOL."Requ<EFBFBD>te SQL = $sql".EOL);
}
flush();
continue;
}
$tabDataToInsert=array();
for($i=0; $i<$nbColonnes; $i++) {
/* if ($i==1) {
$tabM=explode(' ', $data[$i]);
if (strlen($tabM[0])<=2) {
$nom=$tabM[0].' '.$tabM[1];
// unset($tabM[0]);
unset($tabM[1]);
}
else $nom=$tabM[0];
unset($tabM[0]);
$tabM=preg_split('/( NEE | NE )/i', implode(' ', $tabM));
$prenom=$tabM[0];
$usage=$tabM[1];
$tabDataToInsert=array_merge($tabDataToInsert, array('NOM'=>$nom, 'PRENOM'=>$prenom, 'NUSAGE'=>$usage));
} else*/
$tabDataToInsert=array_merge($tabDataToInsert, array($champ[$i]=>$data[$i]));
if (strlen($data[$i])>$tabTailles[$i])
$tabTailles[$i]=strlen($data[$i]);
}
//print_r($tabDataToInsert);
$ret=$iDb->insert($nom_table, $tabDataToInsert);
if ($ret!=1) {
2013-06-19 08:24:49 +00:00
echo date ('Y/m/d - H:i:s') . " - ERREUR <20> l'insertion de la ligne n<>$i : ". implode(';', $data) ." !".EOL;
flush();
}
unset($tabDataToInsert);
}
fclose ($fp);
2013-06-19 08:24:49 +00:00
// On r<>duit la taille des colonnes au max de chaque champ
for($i=0; $i<$nbColonnes; $i++)
{
//$tabTailles[$i]=strlen($data[$i]);
if ($tabTailles[$i]<256) {
$sql="ALTER TABLE `$nom_table` CHANGE `".$champ[$i]."` `".$champ[$i]."` VARCHAR(".$tabTailles[$i].") NULL DEFAULT NULL ";
echo $sql;
if ($iDb->query($sql))
2013-06-19 08:24:49 +00:00
echo date ('Y/m/d - H:i:s')." - Taille du champ $i (". $champ[$i] .") pass<73>e <20> ". $tabTailles[$i] ."...".EOL;
else
2013-06-19 08:24:49 +00:00
echo date ('Y/m/d - H:i:s')." - Impossible de modifier la taille du champ $i (". $champ[$i] .") <20> ". $tabTailles[$i] ." !".EOL;
flush();}
}
echo 'Tailles max / champ:'.EOL;
print_r($tabTailles);
}
echo date ('Y/m/d - H:i:s')." - Fin du traitement.".EOL;
die();
function ecrireFichier($fichier,$texte){
$fp = fopen($fichier, "a");
fwrite($fp, $texte."\r\n");
fclose ($fp);
}
function valideSiret($SIRET) {
if (!is_numeric($SIRET))
return false;
$somme=0;
for ($i=0; $i<=12; $i+=2) { // Traitement PAIR
$var_tmp=(string)(2*((integer)substr($SIRET,$i,1)));
$som_tmp=0;
for($j=0;$j<strlen($var_tmp);$j++)
$som_tmp+=(integer)substr($var_tmp,$j,1);
$somme+=$som_tmp;
}
for ($i=1; $i<=13; $i+=2) // Traitement IMPAIR
$somme+=(integer)substr($SIRET,$i,1);
if ((integer)($somme/10)!=($somme/10))
return false;
return true;
}
?>