Trier un fichier txt pour alimenter un BDD my

Résolu/Fermé
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008 - 26 mars 2008 à 15:30
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008 - 28 mars 2008 à 17:00
Bonjour,

Je souhaite exporter via un logiciel de caisse la table des articles au format .txt séparé par des ";" que vous pouvez voir ci dessous et stocker dans une table la ligne précédé d'un AR et dans une autre table les lignes précédés de DE en rajoutant à chaque ligne le code article du produit que l'on peut trouver dans le premier champs de la ligne AR qui les précède. o_O

je me prend bien la tête mais je ne maitrise pas assez les REGEX pour parvenir à mes fins. ( y compris lire dans un fichier txt et réécrire les 2 tables dans 2 fichiers txt différents ) si vous pouviez juste me mettre sur la voie :lol:

AR;9999997;essai export textile;INCO;BBBBBBB;08ETE;Vrai;41;Faux;;TEXT;10;41000;0;0;Faux;Modèle;;;;ASS;;
DE;A1;;;10;111111111;;;Faux;Vrai;Assortiment 1;;
DE;A2;;;10;22222222;;;Faux;Vrai;Assortiment 2;;
DE;A3;;;10;333333333;;;Faux;Vrai;Assortiment 3;;
DE;A4;;;15;44444444;;;Faux;Vrai;Assortiment 4;;
DE;A5;;;15;5555555;;;Faux;Vrai;Assortiment 5;;
DE;A6;;;15;6666666;;;Faux;Vrai;Assortiment 6;;
AR;9999998;essai david chaussure;INCO;123458;;Vrai;50;Faux;;CHAU;5;50010;0;0;Faux;Modèle;;;;;PBR1;
DE;;0;;5;111111111111;;;Faux;Vrai;;0;
DE;;1;;5;222222222222;;;Faux;Vrai;;1;
DE;;2;;5;33333333333;;;Faux;Vrai;;2;
DE;;3;;8;444444444444;;;Vrai;Vrai;;3;
DE;;4;;8;555555555555;;;Faux;Vrai;;4;
AR;9999999;ESSAI PRODUIT DAVID;INCO;AAAAAAA;CT07;Vrai;20;Vrai;;JOUE;0;20000;0;0;Vrai;Produit;12222222222;13333;14444444444;;;
A voir également:

17 réponses

Utilisateur anonyme
26 mars 2008 à 15:31
Tu utilises quel langage ?
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
26 mars 2008 à 15:33
Bonjour, merci pour cette réponse rapide.
Je programme essentiellement en PHP.
0
Utilisateur anonyme
26 mars 2008 à 15:50
Ton fichier .txt est stocké sur le serveur donc ?
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
26 mars 2008 à 16:04
oui, il est stocké sur le serveur.
je ne maîtrise absolument pas les REGEX, et je ne sais absolument comment faire pour séparer les lignes précédés de AR et celles de DE, et je ne sais pas non plus comment récupérer le code article de la ligne AR pour le rajouter dans un nouveau champs des lignes DE concernés
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
26 mars 2008 à 17:29
A mon avis tu ferais bien d'aller faire un tour sur ce site : http://www.expreg.com/index.php Ça te permettrait de commencer un minimum de code et de venir poser tes questions une fois que tu auras entamé qq chose.
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
26 mars 2008 à 17:49
merci Tassin
mais justement, c'est le début qui me manque. une fois que j'aurais les lignes précédés d'un AR d'un côté et les lignes précédés d'un DE de l'autre je me débrouillerais avec le PHP. mais j'entrave absolument rien aux REGEX pour effectuer ce tri.
0
Utilisateur anonyme
26 mars 2008 à 17:56
Tu devrais utilisé la fonction comme suit :
preg_match('`^AR(:alnum:)*`')


Ceci permet de déterminer les lignes qui commencent par AR.

Tu fais de même pour les lignes en DE.
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
26 mars 2008 à 18:10
Peux tu STP me dire si la logique ci dessous est bonne.
merci
-> j'ouvre le fichier txt
-> on fait une boucle pour lire chaque ligne du fichier texte
-> si la ligne commence par AR
- j'enregistre la ligne
- je controle si ce code article existe déjà dans la table article
- si oui { je remplace es champs existants par ceux contenus dans la ligne; }
- sinon { j'insère la ligne dans la table; }
- je mémorise le code article
- je supprimer les lignes de la table descriptif ou le code article= code_article mémorisé

-> si la ligne commence par DE
- j'insère dans la table descriptif une nouvelle entrée avec dans un champs le code article mémorisé et dans les autres champs les valeurs lus dans la ligne du fichier txt

-> ceci jusqu'à la fin de la boucle
-> on ferme le fichier txt

est ce que c'est le bon chemin à prendre?
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
26 mars 2008 à 18:11
ooops !!! j'avais pas vu ta réponse désolé.

merci
0
Utilisateur anonyme
27 mars 2008 à 10:54
Ta démarche me semble tout à fait correcte en effet. Tu devrais t'en sortir sans Regex à la limite. Je pense qu'une fois que tu as lu ta ligne tu devrais pouvoir la manipuler avec des fonctions sur les chaines, a savoir :

strpos qui permet de rechercher une chaine dans une autre.
strstr qui permet de récupérer une achaine allant de la première occurence d'un mot à la fin.

Tu pourras trouver ttes les fonctions sur les chaines sur ce site : https://www.php.net/manual/fr/function.strstr.php

Bon courage
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
27 mars 2008 à 14:48
merci TASSIN, tu as complètement raison, je ne sais pas du tout pourquoi je m'étais mis dans la tête que j'avais absolument besoin de REGEX que je ne maîtrise pas du tout.
j'ai pondu un bout de code hier qui marche pas mal, il me reste à traiter le table description_articles

je colle le code, si tu vois des failles ou amélioration à apporter c'est avec plaisir que je colmaterais tout ça.
je retourne dessus et viendrais poster le reste du code et j'èspère marquer ce post comme résolu.
merci encore


// on commence à travailler ;o)
if (!$fp = fopen("test_table.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}

else {
// on se connecte à la base de données
mysql_connect("$serveur_mysql","$utilisateur_mysql","$mot_de_passe_mysql") or die ('erreur de connexion'.mysql_error());
mysql_select_db("$bdd") or die ('la base de données n\'existe pas'.mysql_error());
// +-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+-
// on travaille sur le fichier txt
// +-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+-
while(!feof($fp)) { // on li chaque ligne
$Ligne = fgets($fp,255);
$champs = explode(";", $Ligne);
if($champs[0]=='AR') { // la ligne correspond a un article

$code_article=$champs[1]; } // on mémorise le code article
$cherche_code_article=mysql_query("SELECT * FROM articles_base WHERE code_article='$code_article'") or die ('erreur lors de la recherche du code article dans la nase de données'.mysql_error()); // on regarde si ce code article est déjà existant
$presence_code_article=mysql_fetch_array($cherche_code_article);
echo $presence_code_article;
if(!$presence_code_article) // le code article n'existe pas on l'insère dans la bas de données
{ mysql_query("INSERT INTO articles_base VALUES('','$champs[1]','$champs[2]','$champs[3]','$champs[4]','$champs[5]','$champs[6]','$champs[7]','$champs[8]','$champs[9]','$champs[10]','$champs[11]','$champs[12]','$champs[13]','$champs[14]','$champs[15]','$champs[16]','$champs[17]','$champs[18]','$champs[19]','$champs[20]','$champs[21]')") or die ('erreur de remplissage de la table articles'.mysql_error());;
}
// le code article existe, on met à jour les entrées de la BDD ou code_article=code_article_mémorisé
else { mysql_query("UPDATE articles_base SET code_article='$champs[0]',code_fournisseur='$champs[0]',ref_produit='$champs[0]',collection='$champs[0]',famille='$champs[0]',fin_serie='$champs[0]',grille_tarif='$champs[0]',groupe='$champs[0]',prix_vente='$champs[0]',sous_famille='$champs[0]',stock='$champs[0]',stock_dispo='$champs[0]',stocke='$champs[0]',type_article='$champs[0]',code_barre1='$champs[0]',code_barre2='$champs[0]',code_barre3='$champs[0]',grille_taille='$champs[0]',grille_pointure='$champs[0]',grille_couleur='$champs[0]' WHERE code_article='$code_article'") or die ('erreur de mise à jour de la table articles'.mysql_error());
}
}
if($champs[0]=='DE') { echo $code_article.';'.$Ligne.'<br />'; }

// On stocke l'ensemble des lignes dans une variable
$Fichier .= $Ligne;

}
fclose($fp); // On ferme le fichier
}
0
Utilisateur anonyme
27 mars 2008 à 15:10
Pour l'instant tout semble correct. C nikel ;-)

Juste une petite interrogation de ma part :

Es-tu sûr que ton fichier texte contient bien à chaque fois les champs voulus ?

Je m'explique :

Dans l'instruction suivante :
mysql_query("INSERT INTO articles_base VALUES('','$champs[1]','$champs[2]','$champs[3]','$champs[4]','$champs[5]','$champs[6]','$­champs[7]','$champs[8]','$champs[9]','$champs[10]','$champs[11]','$champs[12]','$champs[13­]','$champs[14]','$champs[15]','$champs[16]','$champs[17]','$champs[18]','$champs[19]','$c­hamps[20]','$champs[21]')") or die ('erreur de remplissage de la table articles'.mysql_error());; 


Es tu sûr de pouvoir récupérer à chaque fois $champs[...] ? Tu pourrais juste faire un test à mon avis pour être sûr d'insérer des valeurs correctes dans ta base.

C juste mon avis mais si tu es sûr que ton fichier sera tjs correct alors pas besoin de faire le test ;-)
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
27 mars 2008 à 16:29
ben, j'ai fait un essais que pour l'ajout car j'ai pas terminé pour le modificatiion de la table, mais ça fonctionne. apparemment avec le explode(), lorsqu'il ya 2 ;; juxtaposés ( correspondant à un champs non renseigné dans le logiciel de caisse) , il insère bien un valeur (vide) dans le champs concerné. mais tu as raison que c'est vraiment de la pure fainéantise :o/

@+ tard pour le reste ;o)) et merci encore
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
28 mars 2008 à 16:00
Bonjour TASSIN et tout les internautes,

voici le bout de code terminé, ça fonctionne. Si il y a une erreur ou une amélioration à apporter, je suis preneur.
Si ça vous parait bon, merci de me le confirmer afin que je vienne marquer le sujet comme résolu.


* J'aurais besoin d'une petite explication supplémentaire, j'ai été obligé de passer le champs code_article en varchar(8) au lieu de Mediumint(8) mit initialement car l'entrée était modifié, elle ne correspondait pas au code article, je ne comprend pas pourquoi? su quelqu'un pouvait me donner une explication.

* Idem pour incrémenter une variable. Dans la boucle je suis obligé de mettre $variable=$variable+1; car $variable=$variable++; ne fonctionne pas. Je ne comprend pas :o(

merci

// on se connecte à la base de données
mysql_connect("$serveur_mysql","$utilisateur_mysql","$mot_de_passe_mysql") or die ('erreur de connexion'.mysql_error());
mysql_select_db("$bdd") or die ('la base de données n\'existe pas'.mysql_error());
// +-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+-
// on travaille sur le fichier txt
// +-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+
$total_articles=0;
$articles_ajoutes=0;
$articles_modifiés=0;
$articles_declines=0;
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
	while(!feof($fp)) {
			 // on li chaque ligne
			$Ligne = fgets($fp,255);
			$champs = explode(";", $Ligne);
			if($champs[0]=='AR') { // la ligne correspond a un article
			$total_articles=$total_articles+1; // on compte le nombres d'articles
			$code_article=$champs[1];  // on mémorise le code article
			// on regarde si l'article existe déjà
				$cherche_code_article=mysql_query("SELECT COUNT(*) AS cpt_articles FROM articles_base WHERE code_article='$code_article'");
				$nbr_articles=mysql_fetch_array($cherche_code_article);
				$nbre_articles=$nbr_articles[cpt_articles];
			// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-
			if($nbre_articles==0) 			// le code article n'existe pas on l'insère dans la bas de données
			{

			mysql_query("INSERT INTO articles_base  VALUES('','$champs[1]','$champs[2]','$champs[3]','$champs[4]','$champs[5]','$champs[6]','$champs[7]','$champs[8]','$champs[9]','$champs[10]','$champs[11]','$champs[12]','$champs[13]','$champs[14]','$champs[15]','$champs[16]','$champs[17]','$champs[18]','$champs[19]','$champs[20]','$champs[21]','$champs[22]')") or die ('erreur de remplissage de la table articles'.mysql_error());
			$articles_ajoutes=$articles_ajoutes+1; // on compte le nombres d'articles ajoutés
			}
			// le code article existe, on met à jour les entrées de la BDD ou code_article=code_article_mémorisé
			else { mysql_query("UPDATE articles_base SET code_article='$code_article',designation='$champs[2]',code_fournisseur='$champs[3]',ref_produit='$champs[4]',collection='$champs[5]',famille='$champs[6]',fin_serie='$champs[7]',grille_tarif='$champs[8]',groupe='$champs[9]',prix_vente='$champs[10]',sous_famille='$champs[11]',stock='$champs[12]',stock_dispo='$champs[13]',stocke='$champs[14]',type_article='$champs[15]',code_barre1='$champs[16]',code_barre2='$champs[17]',code_barre3='$champs[18]',grille_taille='$champs[19]',grille_pointure='$champs[20]',grille_couleur='$champs[21]' WHERE code_article='$code_article'") or die ('erreur de mise à jour de la table articles'.mysql_error());
			mysql_query("DELETE FROM articles_declinaisons WHERE code_article='$champs[1]'");

			$articles_modifies=$articles_modifies+1; // on compte le nombres d'articles modifiés
			}
			}
			if($champs[0]=='DE') { 
			mysql_query("INSERT INTO articles_declinaisons values('','$code_article','$champs[1]','$champs[2]','$champs[3]','$champs[4]','$champs[5]','$champs[6]','$champs[7]','$champs[8]','$champs[9]','$champs[10]','$champs[11]','$champs[12]')") or die ('erreur de remplissage de la table articles_declinaisons'.mysql_error());
			
			$articles_declines=$articles_declines+1; // on compte le nombres d'articles déclinés
			} 
	// On stocke l'ensemble des lignes dans une variable
		$Fichier .= $Ligne;
	}
	echo '
	<br /><br />Mise à jour de la base de données éffectuée<br />
	-----------------------------------------------------------------------------------------------<br />
	<b>'.$articles_ajoutes.' articles</b> ont été ajouté<br />
	-----------------------------------------------------------------------------------------------<br />
	<b>'.$articles_modifies.' articles</b> ont été modifié<br />
	-----------------------------------------------------------------------------------------------<br />
	<b>'.$articles_declines.' articles</b> posèdent des déclinaisons sur un total de <b>'.$total_articles.' articles</b> mis à jour.<br />
	-----------------------------------------------------------------------------------------------<br /><br />
';
	mysql_close(); // on ferme la base de données
	fclose($fp); // On ferme le fichier
}

0
Utilisateur anonyme
28 mars 2008 à 16:19
Salut,

Content que tu y sois arrivé t un vrai chef ;-)

Pour ta première question : c'est lors de l'insertion que ça merdait ?

Pour ta deuxième question Tu n'as pas besoin de faire l'affectation. Tu as juste à écrire $variable++ ce qui équivaut $variable=$variable+1 (voir : http://www.manuelphp.com/php/language.operators.increment.php
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
28 mars 2008 à 16:48
merci pour la deuxième question ... c'est rectifié
pour la première, ça ne merde pas vraiment, tout se passe normalement, sauf que quand je vais lire l'entrée, la valeur écrite dans la table ne correspond absolument pas au code article ni à rien d'autre qui pourrait exister dans le fichier txt.

voici le code final si ça peut intéresser quelqu'un
// on commence à travailler ;o)
if (!$fp = fopen("test_table.txt","r")) {
echo "Echec de l'ouverture du fichier";
exit;
}

else {
// on se connecte à la base de données
mysql_connect("$serveur_mysql","$utilisateur_mysql","$mot_de_passe_mysql") or die ('erreur de connexion'.mysql_error());
mysql_select_db("$bdd") or die ('la base de données n\'existe pas'.mysql_error());
// +-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+-
// on travaille sur le fichier txt
// +-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+
$total_articles=0;
$articles_ajoutes=0;
$articles_modifiés=0;
$articles_declines=0;
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
	while(!feof($fp)) {
			 // on li chaque ligne
			$Ligne = fgets($fp,255);
			$champs = explode(";", $Ligne);
			if($champs[0]=='AR') { // la ligne correspond a un article
			$total_articles++; // on compte le nombres d'articles
			$code_article=$champs[1];  // on mémorise le code article
			$code_article_prec=0;
			// on regarde si l'article existe déjà
				$cherche_code_article=mysql_query("SELECT COUNT(*) AS cpt_articles FROM articles_base WHERE code_article='$code_article'");
				$nbr_articles=mysql_fetch_array($cherche_code_article);
				$nbre_articles=$nbr_articles[cpt_articles];
			// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-
			if($nbre_articles==0) 			// le code article n'existe pas on l'insère dans la bas de données
			{

			mysql_query("INSERT INTO articles_base  VALUES('','$champs[1]','$champs[2]','$champs[3]','$champs[4]','$champs[5]','$champs[6]','$champs[7]','$champs[8]','$champs[9]','$champs[10]','$champs[11]','$champs[12]','$champs[13]','$champs[14]','$champs[15]','$champs[16]','$champs[17]','$champs[18]','$champs[19]','$champs[20]','$champs[21]','$champs[22]')") or die ('erreur de remplissage de la table articles'.mysql_error());
			$articles_ajoutes=$articles_ajoutes+1; // on compte le nombres d'articles ajoutés
			}
			// le code article existe, on met à jour les entrées de la BDD ou code_article=code_article_mémorisé
			else { mysql_query("UPDATE articles_base SET code_article='$code_article',designation='$champs[2]',code_fournisseur='$champs[3]',ref_produit='$champs[4]',collection='$champs[5]',famille='$champs[6]',fin_serie='$champs[7]',grille_tarif='$champs[8]',groupe='$champs[9]',prix_vente='$champs[10]',sous_famille='$champs[11]',stock='$champs[12]',stock_dispo='$champs[13]',stocke='$champs[14]',type_article='$champs[15]',code_barre1='$champs[16]',code_barre2='$champs[17]',code_barre3='$champs[18]',grille_taille='$champs[19]',grille_pointure='$champs[20]',grille_couleur='$champs[21]' WHERE code_article='$code_article'") or die ('erreur de mise à jour de la table articles'.mysql_error());
			mysql_query("DELETE FROM articles_declinaisons WHERE code_article='$champs[1]'");

			$articles_modifies++; // on compte le nombres d'articles modifiés
			}
			}
			if($champs[0]=='DE') { 
			mysql_query("INSERT INTO articles_declinaisons values('','$code_article','$champs[1]','$champs[2]','$champs[3]','$champs[4]','$champs[5]','$champs[6]','$champs[7]','$champs[8]','$champs[9]','$champs[10]','$champs[11]','$champs[12]')") or die ('erreur de remplissage de la table articles_declinaisons'.mysql_error());
			
			if($code_article!=$code_article_prec) { $articles_declines++; } // on compte le nombres d'articles déclinés
			$code_article_prec=$code_article;
			} 
	// On stocke l'ensemble des lignes dans une variable
		$Fichier .= $Ligne;
	}
	echo '
	<br /><br />Mise à jour de la base de données éffectuée<br />
	-----------------------------------------------------------------------------------------------<br />
	<b>'.$articles_ajoutes.' articles</b> ont été ajouté<br />
	-----------------------------------------------------------------------------------------------<br />
	<b>'.$articles_modifies.' articles</b> ont été modifié<br />
	-----------------------------------------------------------------------------------------------<br />
	<b>'.$articles_declines.' articles</b> posèdent des déclinaisons sur un total de <b>'.$total_articles.' articles</b> mis à jour.<br />
	-----------------------------------------------------------------------------------------------<br /><br />
';
	mysql_close(); // on ferme la base de données
	fclose($fp); // On ferme le fichier
}
0
chooky97150 Messages postés 11 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 28 mars 2008
28 mars 2008 à 17:00
j'ai oublié de marquer le sujet comme résolue ;o/

c'est fait :o))
0