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 :

Parsing de fichier et split de résultat. [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Par défaut Parsing de fichier et split de résultat.
    Bien le bonjour à tous, voila, je reviens vers vous, car je patauge avec un de mes scripts.

    Le script est tout con, il ne fait pas grand-chose:

    1°/-Vérifier la présence d'un fichier.
    2°/-Ouvrir le fichier.
    3°/-Lire chaque ligne.
    4°/-eclater chaque ligne grâce à preg_split (le pattern etant un espace).
    5°/-Prendre chaque ligne et l'envoyer en BDD en faisant en sorte que chaque partie éclatée correspondent à un champs dans la table donnée.

    Voici ce que je fais pour l'instant:

    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
     
    <?php
     
    function logsparsing(){
     
    	// Déclaration du pattern preg_split //
     
    $pattern = "/\s/"; //On recherche les espaces dans la chaine soumise.//
     
    	// Ouverture du fichier de log	//
     
    $access_log = "/srv/www/squid/content/access.log"; //fichier à lire //
     
    if (is_readable($access_log)) { //test du fichier, possible à ouvrir ou pas.//
    echo "File is readable!";
    $readlog = fopen($access_log,"r+"); //On ouvre le fichier.//
     
    	while (!feof($readlog)) //Boucle jusqu'à l'arrivé en fin de fichier.//
    	{
    		$linesreadlog = fgets($readlog);// On lit le fichier en déplaceant le pointeur ligne par ligne tout en mettant la valeur du pointeur en variable.//
    		foreach($linesreadlog as $linereaded) {
    			$keywords = preg_split($pattern,$linereaded);
    			print_r($keywords);	
    		}
    	}
     
    fclose($access_log);
     
    } 
     
    else {
    	echo "Error - The file can't be read.";	
    }
     
    }
     
    logsparsing();
     
    ?>
    Mon souci ici, c'est le foreach, je n'arrive pas à faire en sorte qu'il me sorte un tableau de la forme:

    array ( [0] = 1320.516, [1] = GET, [2] = http://url.com etc);

    j'ai donc tenté d'afficher le resultat de keywords mais j'ai une erreur sur l'utilisation de foreache, je sais que celui-ci n'accepte en entrée que des tableau apparement, mais fgets ne sort pas de tableau, et l'utilisation de file(); ne fonctionne pas plus.

    Merci de votre aide par avance

  2. #2
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Par défaut
    Bien, pour infos j'ai contourné mon problème de façon plutôt barbare

    mais j'ai encore un souci, à savoir que le fichier que je parse, contient des espaces et des retours à la lignes.

    Le hic c'est que juste après, je fais un preg_split qui viens donc me splitter toutes les string contenues entre ces espaces (grâce à \s+) et donc, je me retrouve avec un tableau de ce type là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Array(
    [0]=>1300809100.513
    [1]=>TCP_MISS/200
    ...
    [9]=>application/x-jav
    [10]=>ascript
    )
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Array(
    [0]=>1300809100.513
    [1]=>TCP_MISS/200
    ...
    [9]=>application/x-javascript
    )
    Sachant que ce n'est pas moi qui génère le fichier de log mais un logiciel tierce, je ne peux pas modifier la façon dont le fichier est crée.

    Je ne sais pas trop comment éviter ce genre de soucis

    PS: Pour ceux que ça interessent, voici comment j'ai fais pour le foreach:

    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
     
    <?php
     
    function logsparsing(){
     
    	// Déclaration du pattern preg_split //
     
    $pattern = "/\s+/"; //On recherche les espaces dans la chaine soumise.//
     
    	// Ouverture du fichier de log	//
     
    $access_log = "/srv/www/lisquid/content/access.log"; //fichier à lire //
     
    if (is_readable($access_log)) { //test du fichier, possible à ouvrir ou pas.//
    echo "File is readable!"."<br>";
    $readlog = fopen($access_log,"r+"); //On ouvre le fichier et on met le pointeur de fichier dans une variable.//
     
    	while (!feof($readlog)) //Boucle jusqu'à l'arrivé en fin de fichier.//
    	{
    		$linesreadlog = array(fgets($readlog));// On lit le fichier en déplaceant le pointeur ligne par ligne tout en mettant la valeur du pointeur en tableau.//
    		foreach($linesreadlog as $linereaded) {
    			$keywords = preg_split($pattern,$linereaded,0,PREG_SPLIT_NO_EMPTY);
    			print_r($keywords);
    			echo "<p></p>";
    		}
    	}
     
    } 
     
    else {
    	echo "Error - The file can't be read.";	
    }
     
    }
     
    logsparsing();
     
    ?>

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Voici une solution plus simple:

    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
     
    <?php
     
    $stmt = $pdo->prepare('INSERT INTO table (a,b,c) VALUES (:a,:b,:c)');
    $res = array();
     
    $file = new SplFileObject("mon_fichier.txt","r");
    $file->setFlags(SplFileObject::READ_CSV);
    $file->setCsvControl(' ');
    foreach ($file as $line) {
    	list($a,$b,$c) = $line;
    	$res[] = $stmt->execute(':a' => $a, ':b' => $b, ':c' => $c);
    }
     
    echo "Success : " . count(array_keys($res, true, true));
    echo "Failures : " . count(array_keys($res, false, true));

  4. #4
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Par défaut
    Merci de ton aide,

    Donc si je comprend bien ton exemple, je créer un nouvel objet de gestion de fichier que tu nomme $file et auquel tu défini des propriétés:

    Lire le fichier en tant que CSVFile.
    Le caractère de séparation étant l'espace.

    Ensuite, je ne comprend pas pourquoi tu utilise liste au lieu de array?

    Pareil, pourquoi je ne trouve pas les fonctions suivantes chez php.net?

    Execute(); et Prepare();

    Merci de ton aide en tous cas.

    EDIT: OK donc de ce que j'ai trouvé exec() et prepare() sont des méthodes de la classe PDOStatement? c'est bien ça?

    Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    L'instruction "list" permet de setter plusieurs variables à la fois en utilisant un tableau, chaque offset du tableau est mis dans la variable de même position dans la liste.
    Voir: http://php.net/manual/en/function.list.php

    execute et prepare font ici référence aux méthodes PDOStatement::execute et PDO::prepare de PDO. Cela permet de créer une requête préparée au niveau de mysql afin de dissocier les traitements des données (sécurité) et d'accélérer les transferts en n'envoyant au travers d'execute uniquement les données utiles et non pas la requête entière.
    Voir: http://julp.developpez.com/php/pdo/?#sommaire

  6. #6
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Par défaut
    Merci à toi pour les infos, je vais bûcher ça

    En fait, je ne savais pas que comme pour les fonctions, php fournissait des classes internes au language.

    Je vais regarder un peu plus, c'est dommage que comme pour la function_list ils ne fournissent pas une Classes_list pour la recherche.

    Sinon, concernant ma question de création de ton objet PDO?
    Pour rappel:
    exec() et prepare() sont des méthodes de la classe PDOStatement? c'est bien ça?

    Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?
    Bref, beaucoup d'infos aujourd'hui, je vais voir pour assimiler ça, tester sur mon script et revenir vers toi dans la semaine si je bloque

  7. #7
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Si, tu as la documentation des classes du langages:
    - SPL: http://www.php.net/manual/en/book.spl.php (FileObject en fait partie)
    - PDO: http://www.php.net/manual/en/book.pdo.php

    Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?
    Mon exemple n'est certes pas complet.

    Voici comment instancier un PDO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $db = "backoffice";
    $db_type = "mysql";
    $db_user = "root";
    $db_password = "";
    $db_host = "localhost";
     
    $pdo = new PDO("$db_type:dbname=$db;host=$db_host", $db_user, $db_password);
    Par exemple. On mets généralement l'instance unique de PDO dans un Singleton, une recherche sur le forum te donnera nombre de tutos sur la question.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/09/2007, 16h14
  2. parsing de fichier texte
    Par robert_trudel dans le forum Access
    Réponses: 4
    Dernier message: 03/06/2006, 17h45
  3. [DOM] [DocumentBuilder] Problème de parsing de fichier
    Par tck-lt dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 13/04/2006, 17h18
  4. Parsing de fichier en C++ : Au secours :(
    Par Triqueur dans le forum C++
    Réponses: 4
    Dernier message: 16/02/2006, 14h49
  5. Réponses: 5
    Dernier message: 10/09/2005, 18h07

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