Page 1 sur 1

Manipulation de fichier texte

Posté : 15 nov. 2011, 11:54
par dani69
Bonjour à tous !

C'est ma première sur ce forum et j'espère pouvoir trouver mon bonheur :)

Je vous explique mon problème : Je suis en stage et on m'a confié comme boulot de faire des manipulations sur un fichier texte qui s'organise de la façon
suivante :
### 1660976 Queries 
### Total time: 5697.51144999981, Average time: 0.0034302190097869
### Taking 0.002950  to 0.611420  seconds to complete
### Rows analyzed 6592 - 6601
SET timestamp=XXX;
SELECT count(id_station) as count FROM tb_station WHERE id_pays = XXX and VALID = XXX;

SET timestamp=1318592706;
SELECT count(id_station) as count FROM tb_station WHERE id_pays = 1 and VALID = 1;
Mon objectif est de récupérer uniquement la requête, puis de dégager tout ce qui se trouve après le WHERE.

J'ai déjà fait ca :
public function getSelectWithoutWhere()
    {
        $requestAnonymised = '';
        $request = '';

        $save = false;
        $cpt = 0;

        foreach ($this->datalog as $line) {

           
            
            if (strpos($line, 'SELECT') !== false || strpos($line, 'UPDATE') !== false) {
                $save = true;
            }
            
            
            if ($save) {
                if ($cpt == 0)
                    $requestAnonymised .= $line;
                else if ($cpt == 1)
                    $request .= $line;
            }



            if ($save == true && strpos($line, ';') !== false && strpos($line, "timestamp") == false) {
                $save = false;

                $cpt++;
            }
//            else if ($save == true && strpos($line, 'WHERE') !== false) {
//                $save = false;
//
//                $cpt++;
//            }
            
            
        }

        echo "<li>$requestAnonymised</li>";

        echo "<li>$request</li>";
    }
J'ai essayé de modifier le code dans tous les sens mais je n'y arrive pas... :cry:
Si quelqu'un peut m'aider je suis preneur :)

Merci !

Re: Manipulation de fichier texte

Posté : 15 nov. 2011, 12:48
par xTG
Pour la suppression du WHERE et clauses suivantes tu peux utiliser un substr() utilisant comme point de répère strpos().
La seconde fonction détecte la clause WHERE et te renvoie l'index où elle commence.
Il ne te reste plus qu'à récupérer la chaîne du début jusqu'à cet index avec substr(). ;)

Re: Manipulation de fichier texte

Posté : 15 nov. 2011, 12:50
par dani69
Merci pour ta réponse :)

je vais essayer ça !

(...)

Finalement je ne comprends pas trop comment utiliser un substr ici... car dans le manuel PHP ils disent:
$rest = substr("abcdef", -1);    // retourne "f"
$rest = substr("abcdef", -2);    // retourne "ef"
$rest = substr("abcdef", -3, 1); // retourne "d"
Mais moi je ne sais pas combien de caractère il y a après le WHERE... Sachant que dans mon fichier entier il y a plus de 2500 requêtes de taille différente.

Re: Manipulation de fichier texte

Posté : 15 nov. 2011, 15:05
par macgawel
Les exemples donnés concernent le cas du départ négatif, pour illustrer.

Dans le cas "normal",
string substr ( string $string , int $start [, int $length ] )
Retourne le segment de string défini par start et length.
(...)
Si start est positif, la chaîne retournée commencera au caractère numéro start, dans la chaîne string. Le premier caractère est numéroté zéro. Actuellement, dans la chaîne 'abcdef', le caractère à la position 0 est 'a', le caractère à la position 2 est 'c', et ainsi de suite.
(...)
Si length est fourni et est positif, la chaîne retournée contiendra au plus length caractères, en commençant à partir du caractère start (en fonction de la taille de la chaîne string).
En gros :
1. Utiliser strpos() pour trouver la position de WHERE dans ta chaîne.
2. Utiliser substr() avec $string = La chaine, $start = 0 (pour prendre à partir du début) et $length = position du WHERE

Re: Manipulation de fichier texte

Posté : 15 nov. 2011, 15:17
par moogli
attention si tu souhaite garder le where
Mon objectif est de récupérer uniquement la requête, puis de dégager tout ce qui se trouve après le WHERE.
faut ajouter le nombre de caractère de where à la position retournée par strpos (il me semble qu'elle retourne le début de la chaine (donc position du w ici ?).

@+

Re: Manipulation de fichier texte

Posté : 15 nov. 2011, 15:22
par Invité
Merci pour tes explications car elles me sont précieuses !!! je dois avouer que j'ai beaucoup de mal avec la DOC de PHP :/

Mon boulot avance petit à petit :)

Re: Manipulation de fichier texte

Posté : 15 nov. 2011, 15:23
par Invité
En fait, je souhaite également dégager le WHERE :)

Re: Manipulation de fichier texte

Posté : 16 nov. 2011, 13:02
par cuir moustache
c'est bon j'ai terminé ! merci à vous ;)
        $requestAnonymised = '';
        $request = '';
//------------------------------
        $requestWithoutWhere = '';
//------------------------------

        $save = false;
        $cpt = 0;

        foreach ($this->datalog as $line) {
            if (strpos($line, 'SELECT') !== false || strpos($line, 'UPDATE') !== false) {
                $save = true;
            }
            if ($save) {
                if ($cpt == 0) {
                    $requestAnonymised .= $line;
                } else if ($cpt == 1) {
                    $request .= $line;
                }
            }
            if (strpos($line, ';') !== false && strpos($line, 'timestamp') == false) {
                $save = false;

                $cpt++;
            }
        }

//--------------------------------------------------------
//substr ( string $string , int $start [, int $length ] ) 
        $requestWithoutWhere = substr($request, 0, strpos($request, 'WHERE'));
//$requestWithoutWhere = substr($request, 0, strpos($request, 'where'));
//--------------------------------------------------------

        $tabResultats = array(
            'anonymised' => $requestAnonymised,
            'request' => $request,
            //-------------------------------------------------------
            'requestWithoutWhere' => $requestWithoutWhere,
                //-------------------------------------------------------
        );