Visualizzazione risultati 1 fino 6 di 6

Discussione: Aiuto con espressione regolare

  1. #1
    L'avatar di foreach
    foreach non è connesso Altervistiano Junior
    Data registrazione
    11-06-2008
    Residenza
    3 metri sotto terra
    Messaggi
    501

    Predefinito Aiuto con espressione regolare

    Ciao a tutti,

    ho un profilo adsense e quindi ho intenzione di elaborare tramite php i rapporti generati da adsense.

    Premetto che li esporto tramite .csv, quindi ogni riga di questo file esportato sarà così:
    Codice:
    2017-01-02	6253	13171	32	"0,51"	"0,24"	"64,09%"	"3,16"
    E con php mi sono arrangiato a elaborare questo:
    Codice PHP:
    $cont = file('rapporto.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    for(
    $i=0;$i<count($cont);$i++) {
    $riga = sscanf($cont[$i], '^\d{4}-\d{2}-\d{2}\s+\d+\s+\d+\s+\d+\s+\w+\s+\w+\s+\w+\s+\w+$');
    var_dump($riga);
    }
    Ovviamente in fase di scrittura codice, uso la funzione var_dump per vedere se ho fatto bene, ma mi dà NULL, il che vuol dire che ho sbagliato.

    Come posso correggere l'espressione regolare?


    Grazie,
    foreach
    Codice PHP:
    foreach($vettore as $chiave => $valore) {
    echo 
    "Ciao";


  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Ciao puoi installare un lettore esadecimale e mostrare il contenuto in esadecimale?? Nella funzione sscanf il formato è % formato consono.. Se mi dai la stringa corretta e cosa vuoi ottenere.. Vedrò cosa posso fare.
    EDIT: Se ogni riga è suddivisa da una nuova linea e vuoi suddividere ogni parola dal carattere horizontal tab.. Puoi usare explode dopo aver suddiviso per new linea.
    Codice PHP:
    <?php
    $cont
    = file('rapporto.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    for(
    $i=0,$size=count($cont);$i<$size;$i++) {
    $cont[$i] = explode("\x09", $cont[$i]);
    }
    var_dump($cont);
    ?>
    il count già è noto... Migliorata la prestazione :)
    Ultima modifica di darbula : 02-02-2017 alle ore 02.35.53

  3. #3
    L'avatar di foreach
    foreach non è connesso Altervistiano Junior
    Data registrazione
    11-06-2008
    Residenza
    3 metri sotto terra
    Messaggi
    501

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Ciao puoi installare un lettore esadecimale e mostrare il contenuto in esadecimale?? Nella funzione sscanf il formato è % formato consono.. Se mi dai la stringa corretta e cosa vuoi ottenere.. Vedrò cosa posso fare.
    La stringa corretta l'ho già scritta nel primo messaggio di questa discussione, mi serve ottenere tutti i numeri di quella stringa, nell'ordine in cui si trovano, per poi elaborarli tramite somma e divisione.

    Citazione Originalmente inviato da darbula Visualizza messaggio
    il count già è noto... Migliorata la prestazione :)
    Giusto, non avevo pensato a questa ottimizzazione ;)



    Grazie,
    foreach
    Codice PHP:
    foreach($vettore as $chiave => $valore) {
    echo 
    "Ciao";


  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Vedi se così può andare..
    Codice PHP:
    <?php
    $cont
    = file('rapporto.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    for(
    $i=0,$size=count($cont);$i<$size;$i++) {
    preg_match_all('/(\d{1,2},{0,1}\d{0,3})/',$cont[$i],$matches,PREG_PATTERN_ORDER);
    unset(
    $cont[$i]);
    }
    var_dump($matches);
    ?>
    .. Per PHP sono ancora stringhe, si dovrebbe convertire in . per i float.. E proprio su quest'ultimo i risultati con i float potrebbero essere approssimativi.. http://php.net/manual/en/language.types.float.php
    Ultima modifica di darbula : 03-02-2017 alle ore 08.31.41

  5. #5
    L'avatar di foreach
    foreach non è connesso Altervistiano Junior
    Data registrazione
    11-06-2008
    Residenza
    3 metri sotto terra
    Messaggi
    501

    Predefinito

    Ma così mi mette ogni singola cifra in un elemento del vettore $matches, non posso impazzire

    Mettendo che voglio eseguire la funzione explode() usando i tab, come posso eliminare le virgolette e convertire in numero decimale una stringa "0,17" o "64,2%"?

    Ovviamente i risultati devono essere 0.17 e 0.642


    Grazie,
    foreach
    Codice PHP:
    foreach($vettore as $chiave => $valore) {
    echo 
    "Ciao";


  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Logica applicativa... Le domande da porci sono.. 1)L'origine dei dati (in questo caso un file CSV avendo 8 campi tra cui 7 numerici e 1 stringa, tutti separati dal tabulatore e new line per i nuovi campi). 2)che operazioni dovremmo svolgere, in questo caso operazioni aritmetiche. Per sostituire una stringa si può ricorrere a strtr, ho invertito la data... Poiché non mi sembrava da AAAA-MM-DD. *si noti che uso UTC 0 .. cioè a meno due ore del nostro fuso orario dunque la funzione time restituirebbe -2 ore.
    Codice PHP:
    <?php
    /* Define our filter class */
    class converter_filter extends php_user_filter {
    function
    filter($in, $out, &$consumed, $closing)
    {
    while (
    $bucket = stream_bucket_make_writeable($in)) {
    $bucket->data = preg_replace('/(\d{4})(-\d{2})(-\d{2})/', '$1$3$2', strtr(strtr(strtr($bucket->data, '%', '"'), ',', '.'), array('"' => '')));
    $consumed += $bucket->datalen;
    stream_bucket_append($out, $bucket);
    }
    return
    PSFS_PASS_ON;
    }
    }

    /* Register our filter with PHP */
    stream_filter_register('converter', 'converter_filter')
    or die(
    'Failed to register filter');

    $fp = file('php://filter/read=converter/resource=rapporto.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    date_default_timezone_set('UTC');
    $m = 0;
    $m2 = 0;
    foreach (
    $fp as &$value) {
    $n = 0;
    $value = explode("\x09", strtotime(substr($value,0, 10)).substr($value, 10));
    foreach (
    $value as &$values) {
    if(!
    strpos($values, '.')) {
    $values = (int) $values;
    }else{
    $values = (double) $values;
    }
    ++
    $n;
    if(
    $n != 1){
    if(!
    $m2){
    $val[$m++] = $values;
    }else{
    $val[$m++] += $values;
    }
    if(
    $n == 8){
    $m = 0;
    $m2 =2;
    }
    }
    }
    }
    unset(
    $value,$values);
    var_dump($val);
    ?>

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •