Page 1 sur 1

[PHP] Aide optimisation de script et recuperation de variabl

Posté : 24 juil. 2009, 17:56
par boubilouga
Bonjour,

Depuis un fichier CSV, je cherche à le convertir en XML.

Le fichier CSV contient une ligne d'en-tete avec les 4 premieres colonnes obligatoire dont les entetes sont fixes. Les suivantes sont de deux types X et Y suivi de un underscore et d'une valeur (il peut y avoir n entrée
AAAA;BBBB;CCCC;DDDD;X_machin;Y_chose

voici un exemple de fichier :

Code : Tout sélectionner

NOM;PRENOM;SEXE;AGE;ADRESSE_RUE;ADRESSE_CODEPOSTAL;ADRESSE_VILLE;COMMANDE_ENTREE1;COMMANDE_ENTREE2 michel;gerard;m;35;rue des champs;75017;paris;2225;5 plous;patrick;m;25;;;;; azeerty;coralie;f;56;;94000;creteil;;10
Je souhaite donc recuperer un fichier XML comme ceci :

Code : Tout sélectionner

<root> <CreerPersonne NOM="michel" PRENOM="gerard" SEXE="m"> <Categorie AGE="35"> <Saisie type="ADRESSE_" name="RUE" value="rue des champs"></Param> <Saisie type="ADRESSE_" name="CODEPOSTAL" value="75017"></Param> <Saisie type="ADRESSE_" name="VILLE" value="paris"></Param> <Saisie type="COMMANDE_" name="ENTREE1" value="5"></Param> <Saisie type="COMMANDE_" name="ENTREE2" value=""></Param> </Categorie> </CreerPersonne> <CreerPersonne NOM="plous" PRENOM="patrick" SEXE="m"> <Categorie AGE="25"> <Saisie type="ADRESSE_" name="RUE" value=""></Param> <Saisie type="ADRESSE_" name="CODEPOSTAL" value=""></Param> <Saisie type="ADRESSE_" name="VILLE" value=""></Param> <Saisie type="COMMANDE_" name="ENTREE1" value=""></Param> <Saisie type="COMMANDE_" name="ENTREE2" value=""></Param> </Categorie> </CreerPersonne> <CreerPersonne NOM="azeerty" PRENOM="coralie" SEXE="f"> <Categorie AGE="56"> <Saisie type="ADRESSE_" name="RUE" value=""></Saisie> <Saisie type="ADRESSE_" name="CODEPOSTAL" value="94000"></Saisie> <Saisie type="ADRESSE_" name="VILLE" value="creteil"></Saisie> <Saisie type="COMMANDE_" name="ENTREE1" value="10"></Saisie> <Saisie type="COMMANDE_" name="ENTREE2" value=""></Saisie> </Categorie> </CreerPersonne> </root>
Et voici le bout de code php qui me permet de faire ça :
echo '<pre>&ltroot&gt</pre>';
$handle = fopen($fichier, "r");
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
   if (!empty($data[0]))
        {
        $nb_col = count($data);
        $ligne++;
        $NOM[] = suppr_accents($data[0]);
        $PRENOM[] = suppr_accents($data[1]);
        $SEXE[] = suppr_accents($data[2]);
        $AGE[] = suppr_accents($data[3]);
        $RUE[] = suppr_accents($data[4]);
        $CODEPOSTAL[] = suppr_accents($data[5]);
        $VILLE[] = suppr_accents($data[6]);
        $ENTREE1[] = suppr_accents($data[7]);
        $ENTREE2[] = suppr_accents($data[8]);

  }
}

for ($c=1; $c < $ligne; $c++) {
echo '<pre>&ltCreerPersonne NOM="'.$NOM[$c].'" IP="'.$PRENOM[$c].'" CodeProjet="'.$SEXE[$c].'"&gt</pre>';
echo '<pre>&ltCategorie SU_ID="'.$AGE[$c].'"&gt</pre>';
echo '<pre>&ltSaisie type="ADRESSE_" name="RUE" value="'.$RUE[$c].'"&gt&lt/Saisie&gt</pre>';
echo '<pre>&ltSaisie type="ADRESSE_" name="CODEPOSTAL" value="'.$CODEPOSTAL[$c].'"&gt&lt/Saisie&gt</pre>';
echo '<pre>&ltSaisie type="ADRESSE_" name="VILLE" value="'.$VILLE[$c].'"&gt&lt/Saisie&gt</pre>';
echo '<pre>&ltSaisie type="COMMANDE_" name="ENTREE1" value="'.$ENTREE1[$c].'"&gt&lt/Saisie&gt</pre>';
echo '<pre>&ltSaisie type="COMMANDE_" name="ENTREE2" value="'.$ENTREE2[$c].'"&gt&lt/Saisie&gt</pre>';
echo '<pre>&lt/Categorie&gt</pre>';
echo '<pre>&lt/CreerPersonne&gt</pre>';
}

fclose($handle);
echo '<pre>&lt/root&gt</pre>';
Ce que je souhaite faire, c'est récuperer les valeurs des entetes dans le fichier CSV pour les utiliser comme variable dans le code PHP, je ne suis pas sur d'etre clair... :roll:

En gros, la valeur de la ligne 1, colonne 1 du fichier CSv est NOM, je veux la transformer en $NOM afin de boulcer et d'éviter de devoir saisir les colonnes supplementaire.

Merci à vous

Posté : 27 juil. 2009, 17:23
par Invité
Bon je me rends compte que ma demande n'est pas clair...

voici plus précisément ce dont j'ai besoin :

J'ai un fichier csv comme ceci :

Code : Tout sélectionner

NOM;PRENOM;SEXE;AGE;ADRESSE_RUE;ADRESSE_CODEPOSTAL;ADRESSE_VILLE;COMMANDE_ENTREE1;COMMANDE_ENTREE2 michel;gerard;m;35;rue des champs;75017;paris;2225;5 plous;patrick;m;25;;;;; azeerty;coralie;f;56;;94000;creteil;;10
Et voici mon code (à corriger car la partie optionel ne fonctionne pas) :
$handle = fopen($fichier, "r");
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
   if (!empty($data[0]))
        {
        $nb_col = count($data);
        $ligne++;

// donnees obligatoire
        $NOM[] = suppr_accents($data[0]);
        $PRENOM[] = suppr_accents($data[1]);
        $SEXE[] = suppr_accents($data[2]);
        $AGE[] = suppr_accents($data[3]);
// optionel
        for ($option=4; $option < $nb_col; $option++) {
	$("OPTIONS"$option)[] = suppr_accents($data[$option]);
	print_r($("OPTIONS"$option));
        }
  }
}
doit donner :

Code : Tout sélectionner

OPTION4 = ADRESSE_RUE.... OPTION5 = ADRESSE_VILLE.... OPTION6 = COMMANDE_ENTREE1.... OPTION7 = COMMANDE_ENTREE2....
Merci à vous.

Posté : 27 juil. 2009, 17:28
par Yosh
Afin de créer dynamiquement des variables, il te faut utiliser les accolades, comme ci-dessous
${"OPTIONS"$option}

Posté : 27 juil. 2009, 17:34
par Invité
Afin de créer dynamiquement des variables, il te faut utiliser les accolades, comme ci-dessous
${"OPTIONS"$option}
Ok, merci je l'avais vu et testé mais ça ne fonctionne pas pour l'attribution des valeurs de la colonne sur cette variable :
${"OPTIONS"$option}[] = suppr_accents($data[$option]);
Parse error... :(

Posté : 27 juil. 2009, 18:46
par Yosh
Afin de créer dynamiquement des variables, il te faut utiliser les accolades, comme ci-dessous
${"OPTIONS"$option}
Ok, merci je l'avais vu et testé mais ça ne fonctionne pas pour l'attribution des valeurs de la colonne sur cette variable :
${"OPTIONS"$option}[] = suppr_accents($data[$option]);
Parse error... :(
Essaye d'enlever les crochets...je pense que tu n'en a pas besoin pour ce que tu veux faire...

Posté : 28 juil. 2009, 11:38
par boubilouga
Bah si justement j'ai besoin de ces crochets...

Je dois affecter toutes les valeurs de mon tableau à une variable dynamique, c'est ce que je n'arrive pas à faire.

Voici mon code actuel qui fonctionne très bien :
$handle = fopen($fichier, "r"); 
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { 
   if (!empty($data[0])) 
        { 
        $nb_col = count($data); 
        $ligne++; 

// donnees obligatoire 
        $NOM[] = suppr_accents($data[0]); 
        $PRENOM[] = suppr_accents($data[1]); 
        $SEXE[] = suppr_accents($data[2]); 
        $AGE[] = suppr_accents($data[3]); 
// optionel 
        $OPTION1[] = suppr_accents($data[4]); 
        $OPTION2[] = suppr_accents($data[5]); 
        $OPTION3[] = suppr_accents($data[6]); 
        $OPTION4[] = suppr_accents($data[7]); 
        $OPTION5[] = suppr_accents($data[8]); 
        $OPTION6[] = suppr_accents($data[9]); 

  } 
}
Si je fais un print_r($OPTION1) j'obtiens bien :

Array ( [0] => ADRESSE_RUE [1] => 35 [2] => 25 [3] => 56 )

Les 4 premieres colonnes sont obligatoire et il peut y avoir n colonnes suivantes optionnelles c'est pourquoi je veux boucler et attribuer des array à des variables dynamiques. Il y a peut-etre mieux que ça, je n'en sais rien étant completement novice en php.

Posté : 28 juil. 2009, 13:16
par Yosh
Je viens de tester le code suivant qui fonctionne parfaitement:

Code : Tout sélectionner

for($i=4;$i<8;$i++) { ${"OPTION$i"} = array("aze","rty"); echo ${"OPTION$i"}[0]."<br>"; }
Te reste plus qu'a analyser et faire les changement nécessaires...

Posté : 28 juil. 2009, 16:08
par Invité
Nickel !!!!!! :D C'est exactement ce dont j'avais besoin.

Mon probleme est résolu :
//ouverture du fichier
$handle = fopen($fichier, "r");
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// on compte le nombre de colonne
$nb_col = count($data);
// si la ligne n'est pas vide
   if (!empty($data[0]))
        {
        for($param=0;$param<$nb_col;$param++) {
                ${"PARAM$param"}[] =  suppr_accents($data[$param]);
        }
        $ligne++;
  }
}
for ($c=1; $c < $ligne; $c++) {
echo '<pre>&ltCreerPersonne '.$PARAM0[0].'="'.$PARAM0[$c].'" '.$PARAM1[0].'="'.$PARAM1[$c].'" '.$PARAM2[0].'="'.$PARAM2[$c].'"&gt</pre>';
echo '<pre>&ltCategorie '.$PARAM3[0].'="'.$PARAM3[$c].'"&gt</pre>';

        for ($col=4;$col<$nb_col;$col++) {
        if(${"PARAM$col"}[$c]) {
        $type = explode("_", ${"PARAM$col"}[0]);
        echo '<pre>&ltSaisie type="'.$type[0].'_" name="'.$type[1].'" value="'.${"PARAM$col"}[$c].'"&gt&lt/Saisie&gt</pre>';
        }
        }
echo '<pre>&lt/Categorie&gt</pre>';
echo '<pre>&lt/CreerPersonne&gt</pre>';
}

fclose($handle);
}

Posté : 28 juil. 2009, 18:29
par Yosh
Pense à marquer ton post en Résolu (en haut à droite) si c'est bien le cas...