{MySQL} mapping d'un fichier text
Résolu/Fermé
achoura
Messages postés
35
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 avril 2010
-
31 déc. 2009 à 12:38
achoura Messages postés 35 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 5 avril 2010 - 1 janv. 2010 à 17:19
achoura Messages postés 35 Date d'inscription jeudi 24 janvier 2008 Statut Membre Dernière intervention 5 avril 2010 - 1 janv. 2010 à 17:19
A voir également:
- {MySQL} mapping d'un fichier text
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Ouvrir un fichier .bin - Guide
- Fichier host - Guide
7 réponses
dam75
Messages postés
1041
Date d'inscription
lundi 4 mai 2009
Statut
Webmaster
Dernière intervention
21 février 2023
67
31 déc. 2009 à 13:39
31 déc. 2009 à 13:39
Bonjour,
Il existe des outils d'importation fournis avec Mysql (mysqlimport), mais ils ne permettent pas de faire des calculs sur les champs ...
Tu as plusieurs solutions :
- intégrer cela tel quel dans une table temporaire, puis écrire une requête qui transformera les champs
Ex d'une requête qui te renvoit le mois numérique pour ton champs supposé être "datetexte" (je ne mets que les 2 derniers, tu vois le principe !) :
SELECT CASE SUBSTR(datetexte, 3,3) WHEN "NOV" THEN 11 WHEN "DEC" CASE 12 END;
Pour l'insertion dans la table définitive, par ex :
INSERT INTO <tatable> (champs_date) SELECT CASE SUBSTR(datetexte, 3,3) WHEN "NOV" THEN 11 WHEN "DEC" CASE 12 END FROM table_tmp;
Par contre, ça risque de donner au final une requête très compliquée ...
- l'écrire en PHP ou autre, puis jouer une requête d'insertion classique INSERT INTO table VALUE (...)
Pour ce faire, il faut "parser" le fichier en PHP (voir la doc sur file_get_contents par ex)
Bon courage
Il existe des outils d'importation fournis avec Mysql (mysqlimport), mais ils ne permettent pas de faire des calculs sur les champs ...
Tu as plusieurs solutions :
- intégrer cela tel quel dans une table temporaire, puis écrire une requête qui transformera les champs
Ex d'une requête qui te renvoit le mois numérique pour ton champs supposé être "datetexte" (je ne mets que les 2 derniers, tu vois le principe !) :
SELECT CASE SUBSTR(datetexte, 3,3) WHEN "NOV" THEN 11 WHEN "DEC" CASE 12 END;
Pour l'insertion dans la table définitive, par ex :
INSERT INTO <tatable> (champs_date) SELECT CASE SUBSTR(datetexte, 3,3) WHEN "NOV" THEN 11 WHEN "DEC" CASE 12 END FROM table_tmp;
Par contre, ça risque de donner au final une requête très compliquée ...
- l'écrire en PHP ou autre, puis jouer une requête d'insertion classique INSERT INTO table VALUE (...)
Pour ce faire, il faut "parser" le fichier en PHP (voir la doc sur file_get_contents par ex)
Bon courage
achoura
Messages postés
35
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 avril 2010
1
31 déc. 2009 à 13:56
31 déc. 2009 à 13:56
Bonjour,
merci pour votre intervention.
pour vous mettre dans le context , c'est une application crée avec Flex 3 et je communique avec la base à travers AMFPHP.
ce que j'ai trouvée comme idée c'est de diviser le problème en deux parties : j'explique :) :
1) étape 1 : insertion des données dans la base dans un table temporaire, la date ici sera inserer comme un string.
2)étape 2: faire une requette dans php pour appeler les données de la base, mettre chaque champ dans une variable php , et la je doit travailler sur la variable qui contienne le fameu champ date pour le formatter.
Enfin, faire une requette INSERT classique dans un autre table.
si seulement vous pouvez m'aider sur ça, je serai trés remerciant
@bientôt
merci pour votre intervention.
pour vous mettre dans le context , c'est une application crée avec Flex 3 et je communique avec la base à travers AMFPHP.
ce que j'ai trouvée comme idée c'est de diviser le problème en deux parties : j'explique :) :
1) étape 1 : insertion des données dans la base dans un table temporaire, la date ici sera inserer comme un string.
2)étape 2: faire une requette dans php pour appeler les données de la base, mettre chaque champ dans une variable php , et la je doit travailler sur la variable qui contienne le fameu champ date pour le formatter.
Enfin, faire une requette INSERT classique dans un autre table.
si seulement vous pouvez m'aider sur ça, je serai trés remerciant
@bientôt
dam75
Messages postés
1041
Date d'inscription
lundi 4 mai 2009
Statut
Webmaster
Dernière intervention
21 février 2023
67
31 déc. 2009 à 14:07
31 déc. 2009 à 14:07
Tu n'as pas forcément besoin de PHP pour cela (piste que je t'ai donnée : INSERT INTO table1 SELECT ... FROM table2)
Mais si tu veux le faire en PHP, il te suffit :
1/ de récupérer les records : mysql_fetch_array et de boucler dessus
2/ de modifier tout ce que tu veux
2/ de construire ta requête d'insertion et de la jouer
Prototype tiré de l'exemple sur https://www.php.net/manual/fr/function.mysql-fetch-array.php :
Ce n'est qu'un prototype, mais comme tu vois le principe n'est pas compliqué ...
Bon courage
Mais si tu veux le faire en PHP, il te suffit :
1/ de récupérer les records : mysql_fetch_array et de boucler dessus
2/ de modifier tout ce que tu veux
2/ de construire ta requête d'insertion et de la jouer
Prototype tiré de l'exemple sur https://www.php.net/manual/fr/function.mysql-fetch-array.php :
mysql_connect("localhost", "mysql_user", "mysql_password") or die("Impossible de se connecter : " . mysql_error()); mysql_select_db("mydb"); $result = mysql_query("SELECT id, name FROM mytable"); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { // ici ton traitement des champs $row_date = transforme_texte_en_date($row["datetexte"]); // insertion dans la table définitive mysql_query("INSERT INTO ... VALUES ('$row_date')"); } mysql_free_result($result);
Ce n'est qu'un prototype, mais comme tu vois le principe n'est pas compliqué ...
Bon courage
achoura
Messages postés
35
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 avril 2010
1
31 déc. 2009 à 14:22
31 déc. 2009 à 14:22
Dear dam75,
c'est exactement ce que je voulais faire,, great thanks.
mais c'est justement la :
que je ne sais pas comment faire :( . est ce que c'est un traitement sur le string ? comment construire le nouveau date ? (from: "02NOV2009" .... to: "2009-11-02")
je suis trés dsl d'être tellement novice dans php, j'éspére que vous serez pas énervé de moi .
thanks for all the way ;)
c'est exactement ce que je voulais faire,, great thanks.
mais c'est justement la :
$row_date = transforme_texte_en_date($row["datetexte"]);
que je ne sais pas comment faire :( . est ce que c'est un traitement sur le string ? comment construire le nouveau date ? (from: "02NOV2009" .... to: "2009-11-02")
je suis trés dsl d'être tellement novice dans php, j'éspére que vous serez pas énervé de moi .
thanks for all the way ;)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dam75
Messages postés
1041
Date d'inscription
lundi 4 mai 2009
Statut
Webmaster
Dernière intervention
21 février 2023
67
31 déc. 2009 à 14:32
31 déc. 2009 à 14:32
pas de soucis ;)
Je te l'écris vite fait en version expression régulière (plus rapide !), tu peux aussi le faire avec les fonctions substr, ...
Evidemment ni testé ni complétement fini (tableau des mois), mais ça devrait le faire ...
A+
Je te l'écris vite fait en version expression régulière (plus rapide !), tu peux aussi le faire avec les fonctions substr, ...
// 31DEC2009 => 2009-12-31 function transforme_texte_en_date($texte) { $mois = array('JAN' => '01', 'FEV' => '02', 'MAR' => '03'); // (je te laisse finir) if (preg_match('/(\d{2})(\w+)(\d{4})/', $texte, $matches) && isset($mois[$matches[2]])) { return $matches[3].'-'.$mois[$matches[2]].'-'.$matches[1]; } else { // format incorrect : retourne ce que tu veux (false, chaine quelconque, date par defaut, ...) ! return false; } }
Evidemment ni testé ni complétement fini (tableau des mois), mais ça devrait le faire ...
A+
achoura
Messages postés
35
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 avril 2010
1
1 janv. 2010 à 11:43
1 janv. 2010 à 11:43
Bonjour,
merci pour tous ceut qui m'on aidé until now ;)
ok,,euuh :(
j'ai cet fichier text à importer dans une base mysql:
exemple de ligne qui se répete: les lignes se terminent par cette chaine "21E " et pas par des retours à la ligne.
j'ai essayé ma requette comme suit:
mais c'est tjs le errcode 22 et je trouve rien dans la base :(
j'ai essayé avec une fichier de test où j'ai écrit qqe nom dans un table : personne(id int(11), nom varchar(50), prenom varchar(50) ) :
et ça marché !! donc je sais pas ou je suis. please help
merci pour tous ceut qui m'on aidé until now ;)
ok,,euuh :(
j'ai cet fichier text à importer dans une base mysql:
1,1,"UQ",7.1,4.7,15.0,"CON",0,0,"CUN",13.3,"02NOV2009","05:25:11",10," ","21E "
exemple de ligne qui se répete: les lignes se terminent par cette chaine "21E " et pas par des retours à la ligne.
j'ai essayé ma requette comme suit:
LOAD DATA INFILE "'.$filePath.'" INTO TABLE `agricontrol_vertwo`.`tmpmesure` FIELDS TERMINATED BY "," ENCLOSED BY "" LINES TERMINATED BY "21E "
mais c'est tjs le errcode 22 et je trouve rien dans la base :(
j'ai essayé avec une fichier de test où j'ai écrit qqe nom dans un table : personne(id int(11), nom varchar(50), prenom varchar(50) ) :
NULL,achoura,noomane,"21E " NULL,ines,souissi,"21E " NULL, rim,drachkoun,"21E "
et ça marché !! donc je sais pas ou je suis. please help
achoura
Messages postés
35
Date d'inscription
jeudi 24 janvier 2008
Statut
Membre
Dernière intervention
5 avril 2010
1
1 janv. 2010 à 17:19
1 janv. 2010 à 17:19
happy new year,
le problème était dans les petits quotes qui manque, voici ma fonction rectifier ;)
@+
le problème était dans les petits quotes qui manque, voici ma fonction rectifier ;)
//add external data function loadExtFile($filePath) { //connexion avec l'utilisateur root à Mysql $dbh = mysql_connect('localhost', 'root', ''); $filePath = addslashes($filePath); //echo $filePath; $sql = "LOAD DATA INFILE ".'\''.$filePath.'\''." INTO TABLE `agricontrol_vertwo`.`tmpmesure` FIELDS TERMINATED BY ',' ENCLOSED BY " .'\'"\'' .' LINES TERMINATED BY "21E"' ; $result = mysql_query($sql,$dbh); return $sql; }
@+