Visualizzazione dei risultati da 1 a 10 su 10

Discussione: parsare un file di log

  1. #1

    parsare un file di log

    Salve gente,
    ho un file di log le cui righe hanno questo formato:

    [dato1] [dato2] ... [dato10] testo generico

    devo realizzare un parser che mi inserisca in 11 variabili distinte il contenuto di ogni riga.

    Ho provato con:

    preg_match_all("|\[(.*)\] \[(.*)\] ecc. (.*)|")

    ma era troppo lento, allora ho provato con degli "explode" che impiegando un terzo del tempo, ma mi costringono a fare una serie di operazioni aggiuntive che inevitabilmente rallentano il tutto.

    Ho provato con "sscanf" ma non ci sono riuscito

    Qualche proposta?

  2. #2

  3. #3
    le espressioni regolari sono il metodo migliore
    Chiamatemi sven se volete non ho voglia di fare una nuova email per una nuova registrazione xD
    Mac Future User , Ventilatore for PC Cooler user , - dry is coming -

  4. #4
    Originariamente inviato da bonaprogram
    le espressioni regolari sono il metodo migliore
    non dal punto di vista della velocità

  5. #5
    Originariamente inviato da Gianni_T
    non dal punto di vista della velocità
    ne sei realmente sicuro?

    in questo caso le espressioni regolari sono la migliore soluzione sotto OGNI punto di vista...

    le PCRE, quando vengono eseguite per la prima volta, vengono "compilate" dal motore interno in modo che non debba ogni volta essere riletta la preg richiesta e quindi si accellera tantissimo

    l'altra alternativa sarebbe ciclarsi carattere per carattere e giocando con una serie di variabili booleane e indici ti segni se sei dentro o fuori dalle quadre e a quale gruppo di variabili sei arrivato

    cmq ti consiglio di usare le preg che sono estremamente veloci ed affidabili...o estrai riga per riga e usi preg_match e sei al sicuro riguardo alla memoria utilizzata...oppure carichi tutto il file e ci lanci su preg_match_all ma ovviamente se il file è troppo grande php non c'è la fa a caricarlo per via del limite della memoria ^^
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    Come ho scritto nel mio primo post, con le preg impiego un tempo circa 3 volte superiore (6 secondi) rispetto all'explode (2,2 secondi).

    Il problema è che per far funzionare a dovere l'algoritmo con l'explode devo aggiungere una serie di piccole istruzioni che mi fanno arrivare il tutto a più di 3 secondi.

    Ovviamente l'interesse per la questione è più accademico che pratico.



  7. #7
    si...ma l'explode non è molto valido, xche se i campi contengono degli spazi va tutto a farsi benedire...o se splitti in base alla quadre comunque devi eliminare l'ultimo carattere...e comunque non saresti sicuro al 100%

    inoltre...hai provato su una singola linea o su un file completo? puoi postare in caso il codice?
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8
    i test sono stati fatti sul file completo.
    Come hai ben notato, con gli "explode" devo togliere la prima parentesi quadra e poi effettuare un'altro explode per l'utima occorrenza trovata dal primo explode, infatti la riga finisce con
    ...[dato10] testo libero
    quindi la prima "explode" mi da come ultima stringa:
    dato10] testo libero
    che quindi devo nuovamente dividere.

    ecco il perché degli ulteriori rallentameni che accennavo nei precedenti post

  9. #9
    Originariamente inviato da Gianni_T
    i test sono stati fatti sul file completo.
    Come hai ben notato, con gli "explode" devo togliere la prima parentesi quadra e poi effettuare un'altro explode per l'utima occorrenza trovata dal primo explode, infatti la riga finisce con
    ...[dato10] testo libero
    quindi la prima "explode" mi da come ultima stringa:
    dato10] testo libero
    che quindi devo nuovamente dividere.

    ecco il perché degli ulteriori rallentameni che accennavo nei precedenti post
    cmq, sinceramente, usa le preg, anche per avere maggiore flessibilità
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  10. #10
    si, penso che alla fine farò così, anche perchè il codice è molto più leggibile (e manutenibile)

    Qualche suggerimento per il trattamento di file di grandi dimensioni?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.