IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Décortiquer un fichier texte séparé par des #


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut [Tableaux] Décortiquer un fichier texte séparé par des #
    Bonjour,

    Comme le dit le titre, je cherche a recueillir des information venant d'un fichier text,

    voici un exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #
    1769#
    An arrow coated with a chemical that will paralyze a target's mouth.
    Inflict the ^880000Silence^000000 status on targets by a low chance.
    Class :^777777 Arrow^000000
    Attack :^777777 1^000000
    Weight :^777777 0.3^000000
    Property :^777777 Neutral^000000
    #
    1770#
    Forged out of iron, this arrow will inflict more damage than one crafted of wood.
    Class :^777777 Arrow^000000
    Attack :^777777 30^000000
    Weight :^777777 0.1^000000
    Property :^777777 Neutral^000000
    #
    645#
    A potent medicine that stimulates concentration.
    Temporarily increases Attack Speed.
    Weight :^777777 10^000000
    Applicable Job :^777777 Every Job^000000
    #
    j'ai déjà une base de donné avec des information différentes de tout les item du fichier texte, on peut les identifier grace a leur id .

    j'aimerai rajouter leur description dans ma base de donnée,
    ce qui veut dire qu'il faudrait que je récupère l'id qui se trouve entre 2 # (rouge).
    et la description (vert) .

    parfois la description ce termine avec le mot weight ou bien avec le mot class .

    Comment procéder ?

    Merci.

  2. #2
    Nouveau membre du Club
    Profil pro
    Développeur multimédia
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Points : 25
    Points
    25
    Par défaut Proposition
    Salut,

    Bon je tente une proposition. Attention, ça vaut ce que ça vaut...

    Premièrement, pour récuppérer les identifiants et le reste du texte, tu peux utiliser la fonction "explode" grace aux "#" (doc). Puis un "foreach" (doc) pour récupérer chaque élément et l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $pieces = explode("#", $contenu_fichier);
    $cpt = 1; // un compteur pour savoir si on récupère un id ou le reste
    $ident = "";
    foreach($pieces as $element)
    {
    	if ($cpt % 2 == 1) // Si $cpt est impaire --> cas d'un identifiant
    	{
    		$ident = $element;	
    	}
    	else // $cpt est pair, on cherche la description
    	{
    		if (strpos($element, "Class") !== false) $descr = explode("Class", $element, 1);
    		elseif (strpos($element, "Weight") !== false) $descr = explode("Weight", $element, 1);
    		else $descr = $element;
    		// ---------------------------
    		// Je fait ici mon insert avec la variable $ident en where
    		// ---------------------------
    		$ident = "";
    	}
    	$cpt++; // J'ajoute un à mon compteur
    }
    Alors précision pour les deux "explore" de la deuxième partie, il sont limité à la première occurance (celle qui ce trouve avant les mot "Class" ou "Weight". J'ai aussi considéré qu'en l'absence des ces deux mots, la description été forcément présente, d'où le "else". Tu peux aussi prolongé le script avec les autres mots "Attack" et "Property".
    Pour les "strpos" (doc), il servent pour savoir si les mot "Class" ou "Weight" sont présent.

    Si y a des choses que tu as pas compris, n'hésite pas. J'ai rien testé par contre...

  3. #3
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    Merci beaucoup

    Alors j'ai quelque peu modifier le code , tu va vite comprendre ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
    session_start();
    require_once("conf.php");
    // connexion a la base de donnee
    $connexion = mysql_connect($host,$user,$mdp) or die (mysql_error());
     
    $db = mysql_select_db($db);
     
     
    // lecture du fichier
     
    $fichier='item.txt';
    $contenu_fichier = fread(fopen($fichier, "r"), filesize($fichier));
     
     
    // script developpez
    $pieces = explode("#", $contenu_fichier);
    $cpt = 1; // un compteur pour savoir si on récupère un id ou le reste
    $ident = "";
    foreach($pieces as $element)
    {
    	if ($cpt % 2 == 1) // Si $cpt est impaire --> cas d'un identifiant
    	{
    		$ident = $element;
    		$_SESSION['id'] = $ident ;	
    	}
    	else // $cpt est pair, on cherche la description
    	{
    		if (strpos($element, "Class") !== false) $descr = explode("Class", $element, 1);
    		elseif (strpos($element, "Weight") !== false) $descr = explode("Weight", $element, 1);
    		else $descr = $element;
    		// ---------------------------
    		// Je fait ici mon insert avec la variable $ident en where
    		// ---------------------------
    		$ident = "INSERT INTO `item_db_desc` VALUES(".$_SESSION['id']." , '$descr')";
    		$query = mysql_query($ident) or die (mysql_error());
    	}
    	$cpt++; // J'ajoute un à mon compteur
    }
     
    ?>
    Mon souci c'est que il rentre tres bien les id dans ma base de donnée, mais pas la description, il m'écrit a chaque fois, Array .

    J'ai ceci comme erreur dans mon navigateur :
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's a whole chapter dedicated to Tristan III. ')' at line 2
    Merci.

  4. #4
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    C'est parce que le explode() te retourne un tableau en fait, donc parfois ton $descr est un tableau et ca fait une erreur, il faudrait faire $descr[0] (mais ton deuxieme else, lui, n'utilise pas de array par contre donc fais attention a ce cas).

  5. #5
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    non en fait parfois j'avai une ligne en partie id qui devai faire 40 caractere, parce que il y avai des description, je les ai supprimer , maintenant, l'errreur est
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's a whole chapter dedicated to Tristan III. ')' at line 2
    Merci.

  6. #6
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    tu dois aussi avoir des apostrophes dans ta chaine, du coup ca fait des erreurs avec les apostrophes qui encadrent les colonnes dans ta requete. Il faut utiliser mysql_real_escape_string() sur ta chaine pour éviter ca

  7. #7
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    HOPP , ce bon,
    c'etait encore une description ...

    Derniere chose , enfin si ces possible, dans les descriptions, j'ai des ^777777 ou ^880000 . et plusiuer d'autre avec des chiffre différents, comment faire pour lui dir, que il faut supprimé le ^ et les 6 chiffre qui suivent ?

    Merci.

    En fait , j'ai un souci, si dans ma description j'ai le mot clas et weight, il va prendre le mot class en premier et ignorer si il y a le mot weight, ce qui fait que dans certain description, j'ai le
    A beautiful gold ring that was made for Christmas.
    Somebody's name is engraved on it.
    ^ffffff_^000000
    Weight :^777777 10^000000
    comment faire?

    Merci.

  8. #8
    Nouveau membre du Club
    Profil pro
    Développeur multimédia
    Inscrit en
    Septembre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Septembre 2007
    Messages : 25
    Points : 25
    Points
    25
    Par défaut
    Oulà, ben il faudrait que ton fichier respecte quand même une certaine syntaxe, sinon faudrait gérer toutes les exceptions et t'es pas sorti de l'auberge.

    M'enfin, vu que ca commence par un "^" ben tu peux toujours couper le texte avec le système de l'explode à partir de ce caractère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (...)
    if (strpos($element, "Class") !== false) $descr = explode("Class", $element, 1);
    elseif (strpos($element, "Weight") !== false) $descr = explode("Weight", $element, 1);
    elseif (strpos($element, "^") !== false) $descr = explode("^", $element, 1);
    else $descr = array($element);
    (...)
    Bon après à toi de savoir où tu le mets dans le test selon ce qui t'arrange. En début, à la fin, ... je pense que là où je l'ai mis ca à l'air bien mais bon essaye.

    Pour l'autre probème de faire disparaitre les "^", ben tu peux utiliser la fonction "str_replace" (doc).

    Contente d'avoir pu t'aider.

  9. #9
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    Donc de retour parmis nous :p

    voici le code ou j'en etait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
    session_start();
    require_once("conf.php");
     
    // connexion a la base de donnee
    $connexion = mysql_connect($host,$user,$mdp) or die (mysql_error());
     
    $db = mysql_select_db($db);
     
     
    // lecture du fichier
     
    $fichier='item.txt';
    $contenu_fichier = fread(fopen($fichier, "r"), filesize($fichier));
     
     
    // script developpez
    $pieces = explode("#", $contenu_fichier);
    $cpt = 1; // un compteur pour savoir si on récupère un id ou le reste
    $ident = "";
    foreach($pieces as $element)
    {
    	if ($cpt % 2 == 1) // Si $cpt est impaire --> cas d'un identifiant
    	{
    		$ident = $element;
    		$_SESSION['id'] = $ident ;	
    	}
    	else // $cpt est pair, on cherche la description
    	{
    		if (strpos($element, "Class") !== false) $descr = explode("Class", $element, 1);
    		elseif (strpos($element, "Weight") !== false) $descr = explode("Weight", $element, 1);
    		else $descr = array($element);
    		// ---------------------------
    		// Je fait ici mon insert avec la variable $ident en where
    		// ---------------------------
    		$ident = "INSERT INTO `item_db_desc` VALUES(".$_SESSION['id']." , '".mysql_real_escape_string($descr[0])."')";
    		$query = mysql_query($ident) or die (mysql_error());
    	}
    	$cpt++; // J'ajoute un à mon compteur
    }
     
    ?>
    Mon souci est que il me reste beaucoup de ligne de description ou il reste le mot Weight, donc je n'ai pas que ma description .

    Comment faire?

    Merci.

    Voici ce que j'ai tester mais sans succes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
    session_start();
    require_once("conf.php");
     
    // connexion a la base de donnee
    $connexion = mysql_connect($host,$user,$mdp) or die (mysql_error());
     
    $db = mysql_select_db($db);
     
     
    // lecture du fichier
     
    $fichier='item.txt';
    $contenu_fichier = fread(fopen($fichier, "r"), filesize($fichier));
     
     
    // script developpez
    $pieces = explode("#", $contenu_fichier);
    $cpt = 1; // un compteur pour savoir si on récupère un id ou le reste
    $ident = "";
    foreach($pieces as $element)
    {
    	if ($cpt % 2 == 1) // Si $cpt est impaire --> cas d'un identifiant
    	{
    		$ident = $element;
    		$_SESSION['id'] = $ident ;	
    	}
    	else // $cpt est pair, on cherche la description
    	{
    		if (strpos($element, "Weight") !== false) $descr = explode("Class", $element, 1);
    //		elseif (strpos($element, "Weight") !== false) $descr = explode("Weight", $element, 1);
    		else $descr = array($element);
    		// ---------------------------
    		// Je fait ici mon insert avec la variable $ident en where
    		// ---------------------------
    		$ident = "INSERT INTO `item_db_desc` VALUES(".$_SESSION['id']." , '".mysql_real_escape_string($descr[0])."')";
    		$query = mysql_query($ident) or die (mysql_error());
    	}
    	$cpt++; // J'ajoute un à mon compteur
    }
     
    ?>
    Vous pouvez essayer par vous même a mettre adresse pour le fichier .txt : http://mimagyc.free.fr/item.txt

    Et les table a faire sont id en INT de 11 et desc en TEXT .


    Merci.

  10. #10
    Membre habitué Avatar de mimagyc
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 151
    Points
    151
    Par défaut
    j'ai reussi en me basant sur la base de donné qui avait été faite avec le script plus haut.
    voila ca qu ej'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <?php
     
    require_once("conf.php");
     
    // connexion a la base de donnee
    $connexion = mysql_connect($host,$user,$mdp) or die (mysql_error());
     
    $db = mysql_select_db($db);
     
    $rq = mysql_query("SELECT * FROM `item_db_desc`") or die (mysql_error());
     
     
     
    while ($li = mysql_fetch_assoc($rq)) {
     
    $desc = $li['desc'];
     
    $id = $li['id'];
     
    if (strpos($desc, "Class :") !== false) { $descr = explode("Class :", $desc) ;  $in= $descr[0] ; echo "$id trouve<br />";}
    else { $in = $desc ; echo "$id Pas trouve<br />"; }
     
     
    $upd = mysql_query("UPDATE `item_db_desc` SET `desc`='".mysql_real_escape_string($in)."' WHERE id=$id ") or die (mysql_error());
     
    }
     
     
    ?>
    une fois avec le mot Weight : et apres avec Class : .

    Merci .

    j'ai pas compris ce que tu m'as dit Lo-Chan .
    Pour les ^ et les 6 chiffre qui suivent ... (nouveau topic pour ca? )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture fichier texte à 3 champs séparés par des "|"
    Par Tony-ESAIP dans le forum VB.NET
    Réponses: 3
    Dernier message: 18/07/2014, 09h58
  2. [Batch] Lire un fichier texte séparer par des tab
    Par Mut dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 16/05/2013, 16h41
  3. Réponses: 3
    Dernier message: 28/11/2010, 19h56
  4. Select dans champ text identifiants séparés par des ;
    Par djanke dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/05/2010, 09h22
  5. Réponses: 1
    Dernier message: 24/07/2009, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo