Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/12/2011, 09h42   #1
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 75
Points : 32
Points : 32
Par défaut Création de lignes motif hh:mm:s

Bonjour,

J'ai un fichier contenant des logs mais malheureusement tous les logs sont sur une seule ligne...
Je dois donc essayer de recréer les lignes en sachant qu'une ligne commence toujours par une heure au format hh:mm:s

Voici un exemple:
Code :
00:00:0	12	14.500:00:3	34	50.023:59:3	16	76.9
Qui devrait donner à la fin:
Code :
1
2
3
00:00:0	12	14.5
00:00:3	34	50.0
23:59:3	16	76.9
Auriez-vous une solution avec la fonction preg_split par exemple?

Merci d'avance pour vos réponses!
gescolino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 09h54   #2
Membre éclairé
 
Avatar de Nowwis
 
Homme
Développeur Web
Inscription : juin 2009
Messages : 363
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juin 2009
Messages : 363
Points : 365
Points : 365
Voici ta regex, à toi de le faire avec un preg_split

Code :
^([0-9]{2}:[0-9]{2}:[0-9]{1}[\t][0-9]{2})([\t])([0-9]{2}[,.][0-9]{1})$
Tu obtiendras un tableau et après une petite boucle avec un retour à la ligne en HTML ou CSS, comme tu veux
Nowwis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h20   #3
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 75
Points : 32
Points : 32
Merci pour cette réponse rapide.
Cependant ma ligne de log contient beaucoup plus de valeurs que celle présentée ici.
Y aurait-il un moyen plus générique pour récupérer le contenu entre les heures?

Code :
hh:mm:s LE CONTENU LIGNE 1hh:mm:s LE CONTENU LIGNE 2hh:mm:s LE CONTENU LIGNE 3 ...
J'ai bien essayé avec ceci:
Code :
([0-9]{2}:[0-9]{2}:[0-9]{1}.*?)[0-9]{2}:[0-9]{2}:[0-9]{1}
Mais il ne me récupère que la première occurrence (même si j'utilise un preg_match_all)
gescolino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h31   #4
Membre éclairé
 
Avatar de Nowwis
 
Homme
Développeur Web
Inscription : juin 2009
Messages : 363
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juin 2009
Messages : 363
Points : 365
Points : 365
Tout a fait, c'est possible, suffit de demander

Code :
^([0-9]{2}:[0-9]{2}:[0-9]{1,2})(.*)$
Je vais t'expliquer un peu en détails comme ça tu devrais t'en sortir :

^ Indique le début de la chaine.

Code :
([0-9]{2}:[0-9]{2}:[0-9]{1,2})(.*)
Un chiffre entre 0 et 9 répété deux fois : [0-9]{2} (corresponde à tes h)
Deux points : :
Un chiffre entre 0 et 9 répété deux fois : [0-9]{2} (corresponde à tes m)
Deux points : :
Un chiffre entre 0 et 9 répété mini 1 fois et maxi 2 fois : [0-9]{1,2} (corresponde à tes s)
N'importe quel chaine de caractère : (.*)

$ Indique la fin de la chaine

Normalement avec ça tu devrais t'en sortir
Nowwis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h37   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
c'est du csv donc utilise fgetcsv, avec comme séparateur une tabulation
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 10h56   #6
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 75
Points : 32
Points : 32
Je suis désolé je dois vraiment être incapable...

Merci pour les explications très utiles.
J'ai donc bien essayé de mettre cette expression et voici ce que j'obtiens:

Array (
[0] => Array (
[0] => 00:00:1 LE CONTENU LIGNE 123:58:1 LE CONTENU LIGNE 223:59:1 LE CONTENU LIGNE 3 )
[1] => Array (
[0] => 00:00:1 )
[2] => Array (
[0] => LE CONTENU LIGNE 123:58:1 LE CONTENU LIGNE 223:59:1 LE CONTENU LIGNE 3 )
)
Je ne comprends pas bien pourquoi il ne prend pas aussi les autres heures.

@stealth35:
J'ai bien pensé à utiliser ceci mais comme ma dernière valeur d'une ligne est collée à mon heure de la ligne suivante, je ne peux donc pas récupérer la dernière valeur pour chaque ligne.
gescolino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h00   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
t'es sur que y'as pas de saut de ligne ? tu l'ouvres avec quoi ton fichier ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h11   #8
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 75
Points : 32
Points : 32
Oui oui certain (notepad++). Le problème c'est que la personne qui a créé le template qui gère ces logs a oublié de mettre un saut de ligne à la fin du template...

Mais grâce à ta remarque j'ai trouvé une solution:

Remplacer toutes les heures par "retour de ligne"+heure.
Ceci implique de devoir en premier parser tout le fichier pour le réécrire proprement dans un nouveau. Je vais devoir faire quelques tests de performance mais ca devrait fonctionner.

L'expression que je vais utiliser sera donc:

Code :
[0-9]{2}:[0-9]{2}:[0-9]{1}
Merci à vous deux en tout cas!
gescolino est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h27.


 
 
 
 
Partenaires

Hébergement Web