Charger un fichier texte dans une base de données mysql

Résolu/Fermé
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014 - 12 févr. 2014 à 14:34
 camile - 1 mai 2015 à 04:27
Bonjour à tous ! je suis débutant en PHP et j'ai un problème dans ce langage qui est le suivant: dans mon projet donc je suis en train de coder en PHP, j'ai un fichier texte que je dois lire chaque ligne contenant 6 mots chacune, et stocker ces 6 mots respectivement dans 6 colonnes d'une table de ma Base de Données (MySQL). Ceci pour toutes les lignes (plus de 100000 lignes). Voici un extrait de ce fichier.

( IM ME ES PU AK MD)

624030743830000 A100001D7DEE6D 80E5FA73 37312379 0E47EA7A6F444640 33830000
624030743830001 A100001D7DEE6E 80AE089F 91944192 F9052B04E3969977 33830001
624030743830002 A100001D7DEE6F 809A1A9F 29861661 4617481A74D864B5 33830002
624030743830003 A100001D7DEE70 80E68950 20303707 1C45F0418B552C45 33830003
624030743830004 A100001D7DEE71 80C275C6 70591541 EA26D0523114FFF2 33830004
624030743830005 A100001D7DEE72 80932253 44181182 1384BC94E9D33B9C 33830005
624030743830006 A100001D7DEE73 8035029C 38663053 1225153351556433 33830006
624030743830007 A100001D7DEE74 80CB3B71 64591576 3C96BB2772B43D85 33830007
624030743830008 A100001D7DEE75 800B3616 06726100 E33622230DA94ABF 33830008

voilà un extrait du contenu de mon fichier texte. Maitenant il faut que je le charge dans une

table (nommée: coord) de ma BD (nommée: gestnu), structure de la table:

colonne 1 -> IM, 2 -> ME, 3 -> ES, 4 -> PU, 5 -> AK, 6 -> MD


S'il vous plait aidez moi je compte beaucoup sur votre aide car mon projet est en arrêt

maintenant à cause de ce problème.

Merci d'avance
A voir également:

23 réponses

Anju44 Messages postés 6 Date d'inscription mardi 28 août 2012 Statut Membre Dernière intervention 31 mai 2014
23 mai 2014 à 09:10
Bonjour,

Tout d'abord, merci d'avoir pris le temps de me répondre ^^

Ensuite, j'ai finalement changé ma façon de faire. J'ai changé ma table comme ceci:
id_compteur, id_imprimante (sans clé étrangère cette fois_ci), date_releve, compteur.

Du coup, j'ai pu changer mon code, pour qu'il prenne le nom d'un fichier (une ip d'imprimante) et cherche dans la base de données cette ip pour en ressortir l'identifiant.

Ca me donne donc quelque chose comme ceci :
<?php

mysql_connect('localhost', 'root', 'a');
mysql_select_db('imprimantes_test');

mysql_query("TRUNCATE TABLE compteurs");

	// Créé une liste des fichiers du dossier Historique (avec des indices)
	$liste = '/script_python/historique';	
	$files = scandir($liste);

	// Parcourt tous les fichiers
	for ($seg = 2; $seg < count($files); $seg++)
	{
		// Affiche seulement le nom des fichiers
		$id = substr($files[$seg], 0, -4);
		$cmd = "SELECT id_imprimante FROM imprimantes WHERE adresse_ip='$id'";
		//echo $cmd;
		$impr = mysql_query($cmd);
		$row = mysql_fetch_array($impr);
		$result = $row['id_imprimante'];
		//print "L'identifiant de $id est $result \n";
	}

// On parcourt tous les fichiers
foreach($files as $unfichier)
{
	while ($data = fgetcsv($unfichier, 1000, ";"))
	{
		//$data correspond à une ligne complète, nous n'avons plus qu'à la couper pour tout récupérer
		$explode = explode(' ', $data[0]);

		// On l'insert dans la base
		mysql_query("INSERT INTO compteurs (id_compteur, id_imprimante, date_releve, compteur) 
				VALUES ('', '.$result.', '$data[0]', '$data[1]');") or die(mysql_error());
	}
}

?>


Seul problème, il me renvoie cette erreur en boucle :
PHP Warning: fgetcsv() expects parameter 1 to be resource, string given in /var/www/test_id.php on line 28

Ju'
0
Profil bloqué
23 mai 2014 à 12:29
Normal, l'erreur te dit clairement que le premier paramètre de fgetcsv doit étre une ressource, hors toi tu lui file une chaine de caractères...

il faut juste que tu ouvre le fichier en question juste avant...

foreach($files as $unfichier)
{
$monfichier = fopen($unfichier,'r');

	while ($data = fgetcsv($unfichier, 1000, ";"))
	{
		//$data correspond à une ligne complète, nous n'avons plus qu'à la couper pour tout récupérer
		$explode = explode(' ', $data[0]);

		// On l'insert dans la base
		mysql_query("INSERT INTO compteurs (id_compteur, id_imprimante, date_releve, compteur) 
				VALUES ('', '.$result.', '$data[0]', '$data[1]');") or die(mysql_error());
	}

fclose($monfichier);
}


Par ailleurs, tu auras d'autre erreurs :

Arrete d'inserer une donnée vide dans la colonne id_compteur...je t'ai montré comment faire hier...

Ensuite tu cherche à inserer en base $result, hors $result n'est défini nul part à ce que je vois dans ton code...

Bon courage ^^
0
Profil bloqué
23 mai 2014 à 12:30
remplace
while ($data = fgetcsv($unfichier, 1000, ";"))


par

while ($data = fgetcsv($monfichier, 1000, ";"))


Désolé j'ai été un peu vite...
0
Anju44 Messages postés 6 Date d'inscription mardi 28 août 2012 Statut Membre Dernière intervention 31 mai 2014
23 mai 2014 à 13:17
Encore merci pour ta réponse !

J'ai essayé ta solution, mais ça me renvoie encore des erreurs en boucle :
PHP Warning: fopen(172.17.105.224.csv): failed to open stream: No such file or directory in /var/www/test_id.php on line 30
PHP Warning: fgetcsv() expects parameter 1 to be resource, boolean given in /var/www/test_id.php on line 34


J'ai essayé autre chose et j'ai un peu modifié, et pour ouvrir mon fichier, j'ai rajouté un if !
// On parcourt tous les fichiers
foreach($liste as $unfichier)
{
	//echo $unfichier;
	if (($handle = fopen($unfichier, "r")) !== FALSE)
	{
		while ($data = fgetcsv($handle, 1000, ";"))
		{
			//$data correspond à une ligne complète, nous n'avons plus qu'à la couper pour tout récupérer
			$explode = explode(' ', $data[0]);

			// On l'insert dans la base
			mysql_query("INSERT INTO compteurs (id_compteur, id_imprimante, date_releve, compteur) 
					VALUES ('', '.$result.', '$data[0]', '$data[1]');") or die(mysql_error());
		}

		// On ferme les fichiers
		fclose($handle);
	}
}


Mais il me renvoie une erreur parce que je ne fais pas appel au répertoire, mais je ne vois pas comment l'appeler :/
(PHP Warning: fopen(172.17.105.224.csv): failed to open stream: No such file or directory in /var/www/test_id.php on line 31)

Pour la donnée vide, ça ne pose pas de problème parce que c'est un identifiant en auto_increment, et j'ai testé sur un autre script, et ça marche très bien ^^

Pour la variable $result, elle est déclarée à la ligne 21 de mon précédent message ^^


Encore merci pour ta patience !
Ju'
0
Anju44 Messages postés 6 Date d'inscription mardi 28 août 2012 Statut Membre Dernière intervention 31 mai 2014
23 mai 2014 à 15:12
J'ai finalement à réussi à atteindre mon objectif final !

Voici mon script terminé :
<?php

mysql_connect('localhost', 'root', 'a');
mysql_select_db('imprimantes_test');

// Remet la table à zéro
mysql_query("TRUNCATE TABLE compteurs");

$repertoire = '/script_python/historique/';

// On récupère tous les fichiers du dossier passé dans la variable repertoire
$MesFichiers = scandir($repertoire);

// $MesFichiers est un tableau contenant tous les fichiers du répertoire $repertoire
foreach($MesFichiers as $unfichier)
{
	if($unfichier != ".." && $unfichier != ".")
	{
		// Affiche seulement le nom des fichiers
		$ip = substr($unfichier, 0, -4);
		$cmd = "SELECT id_imprimante FROM imprimantes WHERE adresse_ip='$ip'";
		$impr = mysql_query($cmd);
		$row = mysql_fetch_array($impr);
		$result = $row['id_imprimante'];

		// $unfichier contient le nom du fichier, on le concatène avec $repertoire pour avoir le chemin complet
		if (($handle = fopen($repertoire . $unfichier, "r")) !== FALSE)
		{
			while ($data = fgetcsv($handle, 1000, ";"))
			{
				//$data correspond à une ligne complète, nous n'avons plus qu'à la couper pour tout récupérer
				$explode = explode(' ', $data[0]);
	
				// On l'insert dans la base
				mysql_query("INSERT INTO compteurs (id_compteur, id_imprimante, date_releve, compteur) 
						VALUES ('', '.$result.', '$data[0]', '$data[1]');") or die(mysql_error());
			}
		
			// On ferme les fichiers
			fclose($handle);
		}		
	}
}

?>


Encore merci pour ton aide ^^

Bonne journée,
Ju'
0