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 :

Lecture de fichier


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Lecture de fichier
    Bonjour,

    j'ai un soucis avec un script. Je dois lire le contenu d'un fichier, le fichier contient des lignes avec des retour a la ligne pour passé a la ligne suivante.

    Voici le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $filedelog	=	$_POST['log'];
    	$fichier	=	'src/'.$filedelog.''; 
    	$tabfich	=	file($fichier); 
    	for( $i = 1 ; $i < count($tabfich) ; $i++ )
    	{
    		echo '#<b>'.$i.'</b> : ' .$tabfich[$i]."<br></br>";
    	}
    Hors quand une ligne contiens un . le script ne saute plus les lignes. Ce que je voudrais c'est que quand le script ouvre le fichier, quand il voit un retour a la ligne, qu'il comprenne qu'il s'agisse d'une nouvelle ligne.

    Cordialement,

    JJROSET.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par JJroset Voir le message
    ...quand une ligne contiens un . le script ne saute plus les lignes...
    Bonjour,
    donne un exemple de fichier (extrait) qui pose problème, car je n'ai rien constaté d'anormal

    NB : tu peux simplifier ton code comme ceci :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	foreach($tabfich as $i => $ligne)
    	{
    		echo '#<b>'.$i.'</b> : ' .$ligne.'<br>';
    	}
    Exemple :
    Générateur de faux texte

    Lorem Ipsum est un générateur de faux textes aléatoires. Vous choisissez le nombre de paragraphes, de mots ou de listes.
    Vous obtenez alors un texte aléatoire que vous pourrez ensuite utiliser librement dans vos maquettes.

    Le texte généré est du pseudo latin et peut donner l'impression d'être du vrai texte.
    Donne :
    #0 : Générateur de faux texte
    #1 :
    #2 : Lorem Ipsum est un générateur de faux textes aléatoires. Vous choisissez le nombre de paragraphes, de mots ou de listes.
    #3 : Vous obtenez alors un texte aléatoire que vous pourrez ensuite utiliser librement dans vos maquettes.
    #4 :
    #5 : Le texte généré est du pseudo latin et peut donner l'impression d'être du vrai texte.

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    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
    Points : 7 762
    Points
    7 762
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $file = new SplFileObject('log', 'r');
     
    foreach ($file as $index => $line)
      printf('#<b>%d</b> %s<br />', $index, trim($line));
     
    }
    Devrait fonctionner un peu mieux.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    et merci pour vos réponses. J'utilise la reponse de Jreaux72.

    voila la ligne ou le script ne passe pas a la ligne suivant.

    #11998 : Oct 3 12:02:48 telmat sendmail[7390]: q939ujq6007381: to=, delay=00:06:03, xdelay=00:06:03, mailer=smtp, pri=161627, relay=smtp.sfr.fr. [93.17.128.85], dsn=4.0.0, stat=Deferred: Connection timed out with smtp.sfr.fr. # : Oct 3 12:02:52 telmat kernel: Shorewall:all2all:REJECT:IN=eth2 OUT=eth3 SRC=192.168.1.20 DST=192.168.2.200 LEN=107 TOS=0x00 PREC=0x00 TTL=127 ID=5857 PROTO=UDP SPT=1067 DPT=161 LEN=87
    Normallement le script devrait afficher:

    #11998 : Oct 3 12:02:48 telmat sendmail[7390]: q939ujq6007381: to=, delay=00:06:03, xdelay=00:06:03, mailer=smtp, pri=161627, relay=smtp.sfr.fr. [93.17.128.85], dsn=4.0.0, stat=Deferred: Connection timed out with smtp.sfr.fr.
    #11999 : Oct 3 12:02:52 telmat kernel: Shorewall:all2all:REJECT:IN=eth2 OUT=eth3 SRC=192.168.1.20 DST=192.168.2.200 LEN=107 TOS=0x00 PREC=0x00 TTL=127 ID=5857 PROTO=UDP SPT=1067 DPT=161 LEN=87
    Et la je bloque, car n'ayant pas des grosse connaissance en programmation.

    Ceci est un exemple des soucis rencontrer, je rencontre plusieurs fois ce type de problème.

    Cordialement,

    JJROSET

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Ou sinon est il possible de dire au script que Tout ce qui commence par "OCT" est un début de ligne ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    OK pour le résultat après traitement.

    Mais c'est l'extrait du fichier original qu'il faudrait nous donner (les lignes qui posent problème), pour qu'on voit comment c'est enregistré dans le fichier (original, donc).

    PS : c'est jreaux62, pas jreaux72 (je ne suis pas au Mans, mais din ch'Nord).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Le soucis c'est que le fichier fait 46000 lignes, donc je peux pas vous transmettre le fichier.

    Je vous transmette les lignes du fichier log.

    11998 Oct 3 12:02:48 telmat sendmail[7390]: q939ujq6007381: timeout waiting for input from smtp.sfr.fr. during client greeting
    11999 Oct 3 12:02:48 telmat sendmail[7390]: q939ujq6007381: to=<xxxxxxxxx@xxxxxxx.com>, delay=00:06:03, xdelay=00:06:03, mailer=smtp, pri=161627, relay=smtp.sfr.fr. [93.17.128.85], dsn=4.0.0, stat=Deferred: Connection timed out with smtp.sfr.fr.
    12000 Oct 3 12:02:52 telmat kernel: Shorewall:all2all:REJECT:IN=eth2 OUT=eth3 SRC=192.168.1.20 DST=192.168.2.200 LEN=107 TOS=0x00 PREC=0x00 TTL=127 ID=5857 PROTO=UDP SPT=1067 DPT=161 LEN=87
    12001 Oct 3 12:02:57 telmat Failoverd[4243]: Erreur acces DNS lien primaire BAD_STATE=1
    12002 Oct 3 12:02:58 telmat kernel: Shorewall:all2all:REJECT:IN=eth2 OUT=eth3 SRC=192.168.1.20 DST=192.168.2.200 LEN=107 TOS=0x00 PREC=0x00 TTL=127 ID=5860 PROTO=UDP SPT=1067 DPT=161 LEN=87
    12003 Oct 3 12:02:59 telmat kernel: e1000e: eth1 NIC Link is Up 100 Mbps Half Duplex, Flow Control: None
    12004 Oct 3 12:02:59 telmat kernel: 0000:01:00.0: eth1: 10/100 speed: disabling TSO

    Les numéro 11998 à 12004 sont les numéro de ligne fourni par notepadd++
    Ps : désoler pour la faute

  8. #8
    Invité
    Invité(e)
    Par défaut
    Un copier-coller ne sert à rien.
    S'il s'agit d'un problème lié à des caractères invisibles, on ne risque pas de les voir !

    Ou d'encodage ? -> "encoder en UTF-8 Sans BOM" ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    je n'ai pas l'autorisation de transmettre les log d'un firewall (Telmat) Désoler .

    Mais coupant certaine parti du log pour vous transmettre uniquement la parti qui ne s'afficher pas correctement, je me suis apercu que le code fonctionner si j'avais uniquement la parti du code que je venais de coupé dans un fichier appart.

    J'ai l'impression que c'est du a la longueur du fichier (nombre de ligne ou taille en MO).

    Pourtant j'ai consulté dans le php.ini.

    max_execution_time = 120
    max_input_time = -1
    memory_limit = 128M

    Cordialement,

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 130
    Points
    130
    Par défaut
    A mon avis c'est plus sûrement un problème d'encodage de ton fichier log ou de caractère invisible comme dit ci-dessus.
    Lorsque tu fais ton copier-coller, tu créés un nouveau fichier (qui aura le bon encadage ou qui n'aurait plus les mêmes caractères invisibles).

    Je penche plus pour un problème de caractère de fin de ligne. Tu en as 2 souvent rencontrés : CR (Carriage Return ou le \r) et LF (Line Feed ou le \n).
    Sur les sytèmes windows, la plupart du temps les fins de ligne sont sur 2 octets : CRLF (les 2 à la suite donc) (bien qu'il y a sans doute des exceptions)... Alors que sur Unix ou MAC, la plupart du temps (par convention) un seul octet est utilisé (je ne sais plus lequel est utilisé sur unix et vice-versa sur MAC).
    Quand tu ouvres ton fichier log dans ton notepad ou je ne sais quel autre logiciel, il est possible qu'il détecte les fins de ligne sur un fichier qui utilise l'un ou l'autre caractère de fin de ligne (et bien entendu la combinaison des 2). Mais ton script PHP ne doit détecter qu'un seul type de retour à la ligne je pense et si ton fichier utilise l'autre, il est possible qu'il ne détecte donc pas ce retour à la ligne. Quand tu copies-colles dans un nouveau fichier, ce nouveau fichier va certainement contenir le bon caractère de fin de ligne (compris par ton script PHP).
    Si tu peux modifier la config sur ton serveur, tente simplement de modifier "auto_detect_line_endings"
    ini_set("auto_detect_line_endings", true);
    Voir : http://www.php.net/manual/fr/filesys...t-line-endings
    Si tu n'as pas accès à la config, faudra se pencher sur une modif du script pour détecter la fin de ligne avec le bon caractère...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour a tous,

    Merci manu_71 pour l'information, malheureusement ce n'est pas sa. Je viens de trouver l'erreur...

    Enfaite, je viens de trouver pourquoi sa me fessait cela. Il faut que je traite les caractère spécial avant d'afficher la ligne. J'ai eu un peu plus de temps pour analysé mon affichage des logs et je m'en suis aperçu .

    Enfaite quand je vous ai montré la ligne 11998 affichée par mon script, il manquer un truc par rapport au fichier log.

    Version script
    #11998 : Oct 3 12:02:48 telmat sendmail[7390]: q939ujq6007381: to=, delay=00:06:03, xdelay=00:06:03, mailer=smtp, pri=161627, relay=smtp.sfr.fr. [93.17.128.85], dsn=4.0.0, stat=Deferred: Connection timed out with smtp.sfr.fr.
    Version log
    11999 Oct 3 12:02:48 telmat sendmail[7390]: q939ujq6007381: to=<xxxxxxxxx@xxxxxxx.com>, delay=00:06:03, xdelay=00:06:03, mailer=smtp, pri=161627, relay=smtp.sfr.fr. [93.17.128.85], dsn=4.0.0, stat=Deferred: Connection timed out with smtp.sfr.fr.
    l'erreur arrive a cette ligne la.
    11999 Oct 3 12:02:48 telmat sendmail[7390]: q939ujq6007381: to=<xxxxxxxxx@xxxxxxx.com>, delay=00:06:03, xdelay=00:06:03, mailer=smtp, pri=161627, relay=smtp.sfr.fr. [93.17.128.85], dsn=4.0.0, stat=Deferred: Connection timed out with smtp.sfr.fr.

    Mon script affiche pas le <xxxxxxxxx@xxxxxxx.com> vue que je pense qu'il me prend comme un caractère de code et non d'affichage.

    Maintenant il faut que je trouve comment faire sauter sa.

    Cordialement,

    JJROSET

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    J'ai ajouter : htmlspecialchars

    pensez vous que c'est la meilleur solution ? Si il y a une meilleur solution, je suis preneur, mais si c'est la bonne solution, je clôturerai le thread.

    Cordialement

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 130
    Points
    130
    Par défaut
    oui en effet, tu ne peux en toute logique pas afficher un < sinon ton navigateur va penser que c'est un balise HTML. htmlspecialchars() est tout à fait la bonne fonction pour convertir ces caractères qui poseront un problème en affichage direct (sans les convertir en HTMl donc).

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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