{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
Bonjour,
je voulais faire un mapping d'une fchier text et insérer les différent champ dans une base de donnée MySQL.
Voici un exemple de lignes :
1,1,"UQ",7.1,4.7,15.0,"CON",0,0,"CUN",13.3,"02NOV2009","05:25:11",10,"    ","21E
1,2,"UQ",7.5,4.9,15.0,"CON",0,0,"CUN",13.3,"02NOV2009","05:25:27",10,"    ","21E


Question :
1) comment faire pour lire la date dans cet format "02NOV2009" ?
2) si ce n'est pas possible directement à travers les requettes Sql, est ce que je peut le faire avec des fonctions PHP avant de lancer la requête ?
3) même question pour le champ time "05:25:11", mais je pense que je peut trouver ça :)

Merci merci merci merci merci pour votre soutient
A voir également:

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
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
0
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
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
0
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
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 :
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
0
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
Dear dam75,
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 ;)
0

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
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, ...

// 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+
0
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
Bonjour,
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
0
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
happy new year,
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;
        }


@+
0