création d'un tableau à partir d'un fichier, possible ?

Invité
Invité n'ayant pas de compte PHPfrance

20 nov. 2006, 09:20

Bonjour à tous,

voici un exmple de fichier texte :

Code : Tout sélectionner

*###* PHPFrance est maintenu par des bénévoles et soutenu par les sociétés Actoo et Anaska, Conseil et Formation pour PHP *===* *###* Pour optimiser vos chances commencez par consulter la FAQ et faites une recherche. Bon esprit, politesse et entraide sont les règles de ce forum. *===* *###* Trouve au salon Inter BEE de Tokyo: le premier ecran plat "Super Hi-Vision", aavec une resolution quatre fois superieure a celle du Full HD actuel... *+++* Il est très difficile de pénétrer aujourd’hui dans les locaux de l’ancienne ambassade américaine à Téhéran *@@@* *===*
en effet j'ai une application en C/C++(que j'ai pas codé) qui génere un fichier texte. Chaque enrégistrement de ce programme commence par un "*###*" et se termine par un "*===*" et chaque enrégistrement peut avoir un "sous" enrégistrement commençant par "*+++*" se terminant par un "*@@@*"...

J'aimerais recupérer le contenu de ce fichier via php pour l'embéllir... donc je pensait à des tableaux...


Quelqu'un peut me dire comment dois je proceder, pour "extraire" ces enrégistrements ?

Mammouth du PHP | 19672 Messages

20 nov. 2006, 10:38

Salut, oui, c'est possible avec une utilisation de explode(). Plutôt qu'un discours, voici une proposition de code, il est commenté, tu devrais t'y retrouver. J'ai repris ton exemple pour créer un fichier que j'ai mis à coté du fichier de traitement :
<?php
/* Fichier source */
$fichier = "./fichier.txt";
/* Délimiteurs */
$debut_2 = "*+++*";
$fin_1   = "*===*";
$md1 = "#\*\#{3}\*#";
$md2 = "#\*\+{3}\*#";
$mf1 = "#\*={3}\*#";
$mf2 = "#\*@{3}\*#";
/* Creation du tableau final */
$tableau = array();
/* Récupération du contenu du fichier */
$contenu = file_get_contents($fichier);
/* Mise en tableau du premier niveau */
$niveau_1 = explode($fin_1, $contenu);
/* Traitement du premier niveau : on supprime le délimiteur de fin */
$nb1 = count($niveau_1);
for($i = 0; $i < $nb1; $i++)
{
    /* Pour chaque occurence trouvée, on supprime le délimiteur de début et les espaces
       inutiles de début et de fin (incluant les retours de chariot) */
    $niveau_1[$i] = trim(preg_replace($md1, "", $niveau_1[$i]));
    /* On teste si il existe des sous-chaines dans l'occurence en cours */
    if(preg_match($md2, $niveau_1[$i]))
    {
        /* Mise en tableau du second niveau */
        $niveau_2 = explode($debut_2, $niveau_1[$i]);
        $nb2 = count($niveau_2);
        if($nb2 > 1)
        {
            for($j = 0; $j < $nb2; $j++)
            {
                $val = trim(preg_replace($mf2, "", $niveau_2[$j]));
                if(!empty($val))
                {
                    $tableau[$i][$j] = $val;
                }
            }
        }
    }
    else
    {
        if(!empty($niveau_1[$i]))
        {
            $tableau[$i][0] = $niveau_1[$i];
        }
    }
}
echo("<pre>\n");
var_dump($tableau);
echo("</pre>\n");
?>
Et l'exécution de ça me donne comme affichage :

Code : Tout sélectionner

array(3) { [0]=> array(1) { [0]=> string(115) "PHPFrance est maintenu par des bénévoles et soutenu par les sociétés Actoo et Anaska, Conseil et Formation pour PHP" } [1]=> array(1) { [0]=> string(146) "Pour optimiser vos chances commencez par consulter la FAQ et faites une recherche. Bon esprit, politesse et entraide sont les règles de ce forum." } [2]=> array(2) { [0]=> string(150) "Trouve au salon Inter BEE de Tokyo: le premier ecran plat "Super Hi-Vision", aavec une resolution quatre fois superieure a celle du Full HD actuel..." [1]=> string(106) "Il est très difficile de pénétrer aujourd’hui dans les locaux de l’ancienne ambassade américaine à Téhéran" } }
Comme tu peux voir, un tableau à deux dimensions.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: