Comment Importer automatiquement un fichier cvs dans ma tabl

Eléphant du PHP | 106 Messages

08 avr. 2012, 14:56

Bonjour,

Je bloque pour importer Importer automatiquement un fichier cvs dans ma table Phpmyadmin


J'aurai besoin d'aide car je suis bloquer dans mon projet et surtout faire la manip à la main me prend bcp de temps.

Voici ma table dan phpmyadmin :

Structure de la table `tfi2003_contacts`
#
 
DROP TABLE IF EXISTS tfi2003_contacts;
CREATE TABLE tfi2003_contacts (
  id_contact int(11) NOT NULL auto_increment,
  id_cat int(11) NOT NULL default '0',
  societe varchar(128) NOT NULL default '',
  titre varchar(64) NOT NULL default '',
  nom varchar(128) NOT NULL default '',
  prenom varchar(128) NOT NULL default '',
  rue varchar(128) NOT NULL default '',
  no varchar(16) NOT NULL default '',
  cp varchar(8) NOT NULL default '',
  localite varchar(128) NOT NULL default '',
  region varchar(64) NOT NULL default '',
  pays varchar(64) NOT NULL default '',
  phone varchar(25) NOT NULL default '',
  phone2 varchar(25) NOT NULL default '',
  fax varchar(25) NOT NULL default '',
  email varchar(255) NOT NULL default '',
  website varchar(255) NOT NULL default '',
  note longtext NOT NULL,
  PRIMARY KEY  (id_contact)
) TYPE=MyISAM COMMENT='Table des contacts';
<?php 
////include ("inc/prive.inc.php");
include("../haut.inc.php");
include ("../inc/fonctions.inc.php");
////include ("config/constantes.inc.php");
Normalisation();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
  <title>Gestion de l'importation des données de Sconet</title>
<a href="index.php">****Accueil Général de la Gestion des sanctions du collège Ponsard****</a>
    <script language="javascript" type="text/javascript" src="inc/fonctions.js">
  </script>
</head>
<body>
<?php
// autorisations pour la page
////autoriser ("admin");
// menu
//require ("inc/menu.inc.php");
?>
<div id="texte">
<h2>Importation du fichier CSV de Sconet, cette importation est longue, veuillez patienter</h2>
<?php
$mode = isset($_POST['mode']) ? $_POST['mode'] : Null;
 
switch ($mode)
 {
 case 'Confirmer': 
	// ouvrir la BD
	include ("../variables.inc.php");
	$lienDB = mysql_connect($bddserver, $bddlogin, $bddpassword);
	mysql_select_db ($bdd);
			//Vide la table 'nom_de_la_table'
	$query = "DELETE FROM elevescomplete";
	$result = mysql_query($query);
	echo $query;
	$handle = fopen("./eleves.csv", "r");
	$ligne = 1;
 
	while (($data = fgetcsv($handle, 5000, ";","\"")) !== FALSE) 
		{
		$num = count($data);
		if ($ligne == 1)
			{
			// sur la première ligne, on trouve les intitulés des colonnes
 
 
			$debutsql = "INSERT INTO elevescomplete (";
			for ($i=0; $i < $num; $i++) 
				{
				$debutsql .= "`$data[$i]";
				if ($i < $num-1) $debutsql .= "`,";
				}
			$debutsql .= "`) VALUES (";
			}
			else
			{
			// sur les lignes suivantes, on trouve les infos à introduire dans la BD
			$sql = $debutsql;
			for ($i=0; $i < $num; $i++) 
				{
				$sql .= "'".mysql_real_escape_string($data[$i])."'";
				if ($i < $num-1) $sql .= ","; else $sql .= ");";
				}
			mysql_query($sql);
			if (mysql_error()) 
				{ 
				echo mysql_error() ."<br>\n";  
				$erreur = true;
				}
			}
			$ligne++;
			//echo "$sql <br />";
			//mysql_query($sql);
 
		}
        echo "L'importation des données semble s'être bien passée.";
		fclose($handle);
		mysql_close ($lienDB);
        if ($erreur == false)
			{
			$texte = "L'importation des données semble s'être bien passée.";
			//redir ("index.php","",$texte, 5000);
            }
			else 
			{
			$texte = "Il s'est produit une erreur durant l'importation.";
			//redir ("index.php","",$texte, 10000);
			}
 break;
 case 'Envoyer':
	// recopie du fichier sous un nom définitif
	$nomTemporaire = $_FILES['fichierCSV']['tmp_name'];
	if( !move_uploaded_file($nomTemporaire, "./eleves.csv") )
		exit("Impossible de copier le fichier.");
 
		echo "<div style=\"text-align: center\">\n";
        echo "<form name=\"form1\" method=\"post\" action=\"{$_SERVER['PHP_SELF']}\">\n";
        echo "<p>Le fichier CSV a été copié sur le serveur.</p>\n";
        echo "<p>Veuillez confirmer l'exportation des données.</p>\n";
		echo "<p>\n<input type=\"reset\" name=\"submit\" value=\"Annuler\"";
		echo "onclick=\"javascript:history.go(-1)\">\n";
        echo "<input type=\"submit\" value=\"Confirmer\" name=\"mode\"></p>\n";
        echo "</form>\n";
        echo "</div>\n";
 
	// tableau de prévisualisation
	echo "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\">\n";
	$handle = fopen("./eleves.csv", "r");
	//while (($data = fgetcsv($handle, 5000, ",","\"")) !== FALSE) 
	while (($data = fgetcsv($handle, 5000, ";","\"")) !== FALSE) 
		{
		$num = count($data);
		echo "<tr>\n";
		for ($i=0; $i < $num; $i++) 
			echo "<td>".$data[$i] . "</td>\n";
		echo "</tr>\n";
		}
	fclose($handle);
	echo "</table>\n";
	break;
 default:
	echo "<form method=\"post\" action=\"{$_SERVER['PHP_SELF']}\" ";
	echo "name=\"form1\" enctype=\"multipart/form-data\">\n";
	echo "<input name=\"fichierCSV\" type=\"file\">\n";
	echo "<input name=\"mode\" value=\"Envoyer\" type=\"submit\">\n";
	echo "</form>\n";
 break;
 }
?>
</div>
 
</body>
</html>

comment puis-je faire cela automatiquement si c'est possible ?
ou dois-je placer le code ? à quel endroit ?

MERCI POUR VOTRE AIDE CAR j'arrive pas à avancer MERCI

ci-dessus un exemple mais est-il adaptable pour mon cas ???

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 avr. 2012, 20:20

Salut,

Pour commencer je te dirais simplement de revoir ta table. (regarde ce que sont les formes normales).
La 1ère forme normale c'est l'atomicité d'une donnée, hors ici la localité, le cp ou le pays respecte pas cette forme, si on poussait le vice la rue ne devrait pas non plus faire partie de cette table.
Donc normalement
Une table
Pays (idpays, nom) (c'est le minimum ;) ).
regions(idregion, idpays, nom)
Villes(idville, idregion, nom, cp)
Typetel(idtypetel, nom) : ça c'est perso, pro, portable, fax, fixe etc etc.
telcontact(idtel, id_contact, idtypetel, numero)
mailcontact(idmail, id_contact, mail)
La table contact devient
DROP TABLE IF EXISTS tfi2003_contacts;
CREATE TABLE tfi2003_contacts (
  id_contact int(11) NOT NULL AUTO_INCREMENT,
  id_cat int(11) NOT NULL DEFAULT '0',
  societe varchar(128) NOT NULL DEFAULT '',
  titre varchar(64) NOT NULL DEFAULT '',
  nom varchar(128) NOT NULL DEFAULT '',
  prenom varchar(128) NOT NULL DEFAULT '',
  rue varchar(128) NOT NULL DEFAULT '',
  no varchar(16) NOT NULL DEFAULT '',
idville  int not null,
  website varchar(255) NOT NULL DEFAULT '',
  note longtext NOT NULL,
  PRIMARY KEY  (id_contact),
constraint fk_ville foreign key idville references villes(idville)
) TYPE=innodb COMMENT='Table des contacts';
 
L'avantage c'est que tu n'est plus limité dans le nombre de mail ou de numéro et que tu n'est pas obligé d'avoir de champ vide.
Tu ne peux avoir d'erreur sur le nom des villes / régions, pays.
Un désavantage c'est qu'il faut bosser un peux plus, les requêtes sont un poil plus complexes.
Regarde aussi du côté des jointures SQL.

Quand a ton code, il semble fonctionnel, qu'est ce qui ne va pas ?
Y a moyen de simplifier une peu la chose (en évitant les multiples boucles for t en utilisant le tableau pour mettre les infos au bonne endroit).
Je te conseillerais de regarder du côté de PDO et des requêtes préparées ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 106 Messages

09 avr. 2012, 20:58

Merci pour ton aide mais je n'arrive pas à le faire fonctionner même en modifiant ma table :cry:

On ma conseillé plus rapide et plus simple pour transférer les données
LOAD DATA INFILE 'mon_texte.txt' 
INTO TABLE annuaire2012.tfi2003_contacts 
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES


http://dev.mysql.com/doc/refman/5.0/fr/load-data.html
mais je n'arrive pas y-a-t-il qq qui peut m'aider avec un exemple simple ?

Importer automatiquement un fichier cvs dans ma table Phpmyadmin cela existe mais pas facile à faire à ce que je vois ?
y-a-t-il un expert qui maîtrise le Php sql qui peu m'aider ?

Merci de votre aide

Mammouth du PHP | 2278 Messages

09 avr. 2012, 22:24

Salut,
Pour commencer je te dirais simplement de revoir ta table. (regarde ce que sont les formes normales).
@+
Il est compréhensible que, récupérant des données en provenance d'une application officielle, le coupable de non respect des formes normales n'ait pas pensé à ventiler ses données.
Je ne suis pas certain d'ailleurs qu'il y trouve un quelconque intérêt dans la mesure où, lors d'un changement de données, il recevra un fichier scolnet d'une structure qu'on peut espérer identique, contenant toutes les données mises à jour.

Il existe, que je n'ai pas testé, faisant mes imports par ma propre fonction:
http://fr2.php.net/manual/fr/function.fgetcsv.php
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 avr. 2012, 14:19

Ce n'est parce que les autres font de la "merde" que l'on doit en faire.

Ceci dit c'est la bonne période pour ce transformer en mouton ;)

De toute façon le fichier csv sert de "partage" on fait ce que l'on veux derrière.
Ça pourrais être une webservice qui fournit du json ou du XML le problème serait le même.


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 106 Messages

10 avr. 2012, 21:35

Merci mais pour mieux comprendre comme je suis débutant pouvez-vous m'envoyer un exemple simple avec un fichier CSV. Merci pour votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 avr. 2012, 22:00

Regarde la doc mise dans les messages précédents.


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

11 avr. 2012, 13:37

Ce n'est parce que les autres font de la "merde" que l'on doit en faire.

Ceci dit c'est la bonne période pour ce transformer en mouton ;)

De toute façon le fichier csv sert de "partage" on fait ce que l'on veux derrière.
Ça pourrais être une webservice qui fournit du json ou du XML le problème serait le même.


@+
Il s'agit d'une liste d'élèves...
Alors, indique une méthode simple pour transformer ce fichier CVS en autant de tables que le requierent les formes normales:
il va falloir au bas mot
stocker quelque part le fichier CVS (ce qui suppose qu'on a su ,le lire... question initiale) : dans TAb mettons
extraire tous les noms de bureau-distributeur
vérifier qu'il n'y a pas des différences dans les saisies initiales en comparant les codes postaux
créer la table des bureaux<->codes_postaux<->id-bureau
Modifier TAB pour y intégrer ces éléments
Créer une table statut_famille (0 : deux parents ensemble/ 1 : 1 seul parent /2 deux parents séparés/3 élève majeur)
Parcourir TAB et, pour chaque élève mettre à jour sn statut familial
Si par hasard TAB contient des indications d'origine (collège ou classe précédent), faire le même boulot...
et ainsi de suite pour tout ce qui peut-être normalisé :
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 avr. 2012, 18:36

Pour lire le fichier la fonction file est assez pratique, sinon les. Massique fopen etc

Après oui ça demande du boulot, mais il existe des procédures stockées pour faire faire le boulot au sgbd, o alors récupérer les infos avant dans des tableaux / objets et les utiliser pour préparer les requêtes.

Je n'ai pas et que c'était simple, juste "mieux".

Après il fait ce qu'il veux s'il préfère avoir un truc bancale c'est comme y veux, mais complexifier un peu le code, sur le principe, n'est pas forcément une erreur en soit, sinon on met la poo et les frameworks à la poubelle et on refait que du procédurale à la vas y que j'te pousse et passer 3jours à 12 mecs pour modifier un champs c'est aussi réalisable et souvent vendable on en a même parfois des exemples ici de montons à 3 pattes ;)



@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

15 avr. 2012, 14:27

Agacement, trollesque et dernière intervention sur ce sujet
Entre l'énoncé des grands principes qui mélange tout:
entre la POO qui est loin d'être la panacée, avec son cortège de notations pointées ou leurs équivalents (J'en sais qq ch pour avoir pratiqué le premier en France C++ avec le C++ d eGlockspiel, et avoir écrit un SuperPaint en Java), de fichiers inclus (en ce moment je traduis du Python, et merci les from bidule import machin pour s'éviter bidule.machin...) et la normalisation des bases de données qui, elle, est un acquis fiable et semble-t-il stable, il n'y a pas grand rapport.
Ce qui est certain c'est que tout ce débat trolleybus n'aide en rien le questionneur initial.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 89 Messages

16 avr. 2012, 00:54

Peux-être les crontabs pour automatiser les tâches d'imports.
Les crons marchent que sur un système unix, tu pourrais utiliser z-cron sur windows si tu travail en local.
Tu créer un fichier .bat dans lequel tu indiques la commande qui lance php.exe en mode CLI et tu indiques également le script php à executer.
Je ne sais pas si j'ai bien répondu à ta question.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 avr. 2012, 09:01

Peux-être les crontabs pour automatiser les tâches d'imports.
Les crons marchent que sur un système unix, tu pourrais utiliser z-cron sur windows si tu travail en local.
Tu créer un fichier .bat dans lequel tu indiques la commande qui lance php.exe en mode CLI et tu indiques également le script php à executer.
Je ne sais pas si j'ai bien répondu à ta question.
je pense que le soucis est plus du coté du traitement que de l'automatisation. Pour info Windows embarque aussi un système de tache planifiées appelé : tache planifiée :)
Agacement, trollesque et dernière intervention sur ce sujet
Entre l'énoncé des grands principes qui mélange tout:
entre la POO qui est loin d'être la panacée, avec son cortège de notations pointées ou leurs équivalents (J'en sais qq ch pour avoir pratiqué le premier en France C++ avec le C++ d eGlockspiel, et avoir écrit un SuperPaint en Java), de fichiers inclus (en ce moment je traduis du Python, et merci les from bidule import machin pour s'éviter bidule.machin...) et la normalisation des bases de données qui, elle, est un acquis fiable et semble-t-il stable, il n'y a pas grand rapport.
Ce qui est certain c'est que tout ce débat trolleybus n'aide en rien le questionneur initial.
comme d'hab pas d'accord, donc pas content.
je ne suis le premier en rien et surement trop con pour ne pas vouloir laisser les gens faire un code bancale. C'est aussi égoiste de ma part pour éviter qu'il revienne avec un truc trop bancal pour qu'il s'y retrouve et que les autres (dont moi) n'y arrive pas non plus.

De toute façon il n'a pas répondu depuis le load data infile ^^


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

17 avr. 2012, 19:58

Je dirai simplement que:
Tout à fait d'accord pour normaliser
quand on crée tout et qu'on a la maîtrise de la mise en place des données
quand la base est appeléle à être mise à jour, ce pourquoi, essentiellement les formes normales ont été conçues.
Mais normaliser l'import d'un fichier ça risque de demander une programmation titanesque:
rien que pour les associations bureau distributeur<=>codes postaux, il va falloir parcourir le tableau et, pour chaque code postal, uniformiser le bureau-distributeur correspondant: dans la mesure où ce fichier n'est pas normalisé, on a bien des chances de trouver sous le même code (999321 pour l'exemple): Saint Denis, St Denis... et on ne peut pas simplement remplacer tous les bureux distributeurs ayant comme code 999321 par Saint Denis ou un pointeur dessus.
Est-on certain que le fichier d'origine distingue clairement
999321 = St Denis
et
Tartempion la lune
999321 St Denis

Quand il s'agit de l'emploi ponctuel, vraisemblablement pour pouvoir constituer des cohortes, d'un fichier qui n'évoluera pas, et sera remplacé par d'autres au fur à mesure de l'évolution des affectations au niveau rectoral...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 106 Messages

18 avr. 2012, 22:10

sans être arbitre mais là bcp d 'avis mais on tourne autour du pot :

commencer simplement : Y a-t-il un expert php sql qui peu nous aiguiller ?

rappel du besoin à résoudre importer automatiquement des données en csv dans une table deja existante

QQ 'un peu transmettre un exemple avec 2 fichiers pour que je puisse tester dans mon localhost fichier www

Merci pour ceux ou celles qui peuvent m'aider car avec des exemples concrait qui fonctionne nous résoudrons bcp d 'intérrogation car à ce jour c le GRAND BROUILLARD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 avr. 2012, 23:22

suis le lien vers la doc de sirakawa (fgetcsv) y a des exemples dedans.

pour l'insertion une requête préparée semble s'imposer
Avec PDO
avec l'extension mysql

a partir du moment où tu connais la structure du fichier il s'agit d'une boucle

Attention toute fois a la taille du fichier pour ne pas atteindre la limite de 30s de vie du script php.

il y a tout dans l'exemple de ton 1er message
de l'upload du fichier
au traitement du fichier.

le principe est simple
- afficher le formulaire
- Valider l'upload du fichier (par défaut taille max d'un fichier 2Mo, a vérifier dans un phpinfo
- Parcourir le fichier et insérér les données dans la base. suivant la taille du fichier la fonction file peux être avantageuse et simplifier la chose.
le script tourne autour d'une seule boucle (while ou foreach) qui contient la requête d'insertion.


@+
Il en faut peu pour être heureux ......