Manipulation de fichier texte

Petit nouveau ! | 2 Messages

15 nov. 2011, 11:54

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 !
Modifié en dernier par zeus le 15 nov. 2011, 12:39, modifié 1 fois.
Raison : Ajout de balises de mise en forme du code

ViPHP
xTG
ViPHP | 7331 Messages

15 nov. 2011, 12:48

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(). ;)

Petit nouveau ! | 2 Messages

15 nov. 2011, 12:50

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.

Mammouth du PHP | 672 Messages

15 nov. 2011, 15:05

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 nov. 2011, 15:17

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 ?).

@+
Il en faut peu pour être heureux ......

Invité
Invité n'ayant pas de compte PHPfrance

15 nov. 2011, 15:22

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 :)

Invité
Invité n'ayant pas de compte PHPfrance

15 nov. 2011, 15:23

En fait, je souhaite également dégager le WHERE :)

cuir moustache
Invité n'ayant pas de compte PHPfrance

16 nov. 2011, 13:02

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,
                //-------------------------------------------------------
        );