Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    20

    file txt to array multidim

    Salve,

    ho un problema di array su 2 dimensioni.

    ho un file di log (testo), contenente più o meno le stesse informazioni su ogni riga.
    Quello di cui avrei bisogno è estrapolare da ogni riga solamente alcuni valori (che dovrebbero trovarsi sempre nella stessa posizione).

    Esempio riga di log:
    *Jul 19,2010,15:51:37 #CDR-informational: Extension Port/Number : /842 Call Session Start : 07/19/2010-15:51:17-330 Call Session End : 07/19/2010-15:51:37-240 Dialed Number : 3473422xxx Call Duration(min:sec) : 0:20 Call Status : CS_NORMAL_RELEASE
    ... e cosi via per altre righe

    dati da estrarre:
    Data = *Jul 19,2010,15:51:37
    Chiamante = 842
    Chiamato = 3473422xxx
    Durata = 0:20

    Infine dovrei inserire questi dati in output in un altro file di testo.

    Ho provato con le regexp, ma purtoppo gli esempi in giro (come anche per gli array) sono fatti da persone che per chissa quale motivo scrivono porzioni di codice supercompresso, come se scrivere tutti i passaggi fosse da schiappe

    Non sono un programmatore php, ma sto provando a fare di necessità virtù.

  2. #2
    considerando che ogni riga del file di testo equivale ad un valore dell'array, puoi lavorare in più fasi:
    1) crei l'array completo
    2) cicli l'array e (utilizando funzioni per lavorare con le stringe (ad esempio explode ) puoi estrapolare una parte di stringa

    es $new_str = explode(' ',$str);

    crea un array partendo dalla variabile $str suddividendola per ogni spazio (il primo valore)

    così puoi pulire la stringa e recuperare un array "pulito"

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    20
    dunque io ho creato cosi un array contente il file:

    <?php
    $lines = file ('statistiche2.log');

    foreach ($lines as $valore )
    {

    }

    ?>

    non ho capito però cosa intendi che faccia nel ciclo... dovrei depurare gli spazi ?
    o dovrei aggiungere ogni elemento di una riga, che non sia "spazio", in un nuovo array e poi andarmi a prendere in questo nuovo array i valori nella posizione [n] ?

  4. #4
    codice:
    <?php
    $lines = file ('statistiche2.log');
    
    $dati = array[];creo un array vuoto;
    foreach ($lines as $valore )
    {
            
         $tmp = explode(' ',$valore );//qui suddivido ogni riga in un array, usando lo spazio come      delimitatore(cerca la documentazione di explode)
    
    
    $dati[] = $tmp[0].' '.$tmp[3];// ora avendo la riga divisa in pezzi posso creare un array come piace a me (in questo caso il primo ed il 4 blocco)
    
    }
    
    ?>

    questa è la procedura che userei io

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    20
    nun se po fa....

    gli elementi non stanno sempre nello stesso posto...

    es.
    riga1
    *Jul 19,2010,15:52:42 #CDR-informational: Extension Port/Number : /842 Call Session Start : 07/19/2010-15:52:24-560 Call Session End : 07/19/2010-15:52:42-830 Dialed Number : 3473422444 Call Duration(min:sec) : 0:18 Call Status : CS_NORMAL_RELEASE

    riga 2
    *Jul 19,2010,15:53:48 #CDR-informational: Extension Port/Number : TS#(256) BRI:0/3/1(0)/3473422444 Call Session Start : 07/19/2010-15:53:42-190 Call Session End : 07/19/2010-15:53:48-900 Dialed Number : 227439842 Call Duration(min:sec) : 0:6 Call Status : CS_NORMAL_RELEASE

    avevo creato l'array come mi avevi detto... ma provandolo a stampare a video mi sono accorto che gli elementi che mi interessano non stanno sempre nella stessa posizione...

    codice:
    <?php
    $lines = file ('statistiche2.log');

    foreach ($lines as $valore )
    {

    $tmp = explode(':',$valore );//qui suddivido ogni riga in un array, usando lo spazio come delimitatore(cerca la documentazione di explode)

    $dati[] = $tmp[0].' '.$tmp[1].' '.$tmp[4].' '.$tmp[23].' '.$tmp[27] ;//ora avendo la riga divisa in pezzi posso creare un array come piace a me (in questo caso il primo ed il 4 blocco)


    print "$dati[0] \r\n";
    print "$dati[1] \r\n";
    }

    Se veramente non si puo fare in questo modo.. voi come fareste ?

  6. #6
    io ti ho dato un'idea, magari invece dello spazio come delimitatore puoi usare * o il : ..... non conosco il formato dei file ma sicuramente uno standard c'è

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    20
    si avevo provato a sostituire " " con ":" ma purtroppo non è un parametro "standard" per tutte le righe...
    Ora provo a guardale meglio (anche se mi sembra che non ci sia un filo conduttore)

    ma se non dovesse esserci uno standard ?
    piu che altro lo standard separatore ci potrebbe anche essere.. ma cmq i campi che interessa estrapolare a me potrebbero non essere sempre in quella posizione.. e quindi ciclare per posizioni sarebbe inutile...

    any suggestion ?

  8. #8
    considera 2 cose
    1) puoi delimitare non solo con un carattere ma anche con intere parole
    $tmp = explode('Duration(min:sec) ',$riga)

    una volta che hai un nuovo valore lo puoi rifare

    $tmp_2 = explode(' : ',$tmp[2]);
    ma visto la complicanza ti conviene leggerti qualcosa sulle espressioni regolari.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    22
    mmm dovresti provare a fare cosa del tipo:



    codice:
    <?php
    $lines = file ('statistiche2.log');
    
    $dati = array[];//creo un array vuoto;
    
    $searcIndexes = array("caller" => "Port/Number", "callStart" => "Start","callEnd" => "End","calledNumber" => "Number","duration" => "Duration(min:sec)","stauts" => "Status");//lista degli elementi da cercare
    
    foreach ($lines as $value){
    	$endOfStrHead = strpos($value,": ");//trovo la prima occorrenza della stringa ": "
    	
    	$strNoHead = trim(substr($value,$endOfStrHead+1));//taglio la stringa a partire dal valore successivo all'occorrenza di ": " eliminando gli spazi all'inizio e alla fine se ci sono.
    	
    	$explodedValues = explode(" : ",$strNoHead);//esplodo l'array sul separatore " : "
    	
    	$linearValueArray = array();//creo un arrayi dove metto i miei dati tutti spezzati lo creo qui così da averlo pulito per ogni riga
    	
    	foreach($explodedValues as $ExValue){
    	
    		$innerValue = explode(" ",$ExValue);//esplodo sull " " gli elementi separati su " : "
    	  
    		foreach($innerValue as $InValue){
    			$linearValueArray[] = $InValue;//nell'array avrro le singole "parole" 1 per elemento.
    		}
    	
    		foreach($searcIndexes AS $key => $index){
    	
    			$keySearched = in_array($index,$linearValueArray);//cerco le chiavi che mi interessano (elemnti da cercare) per avere il valore della chiave
    	  
    			if($keySearched !== false){//se non ho un falso boleano (in array può ritornare 0 che con != può essere scambiato per falso booleano )
    				$dati[$key] = $linearValueArray[$keySearched+1];//il valore successivo alla chiave trovata è l'elemento che mi interessa e lo salvo usando la chiave dell'emento trovato come chiave per il valore.
    			}
    		}
    	}
    }
    
    ?>
    non è testato quindi potresti avere degli errori sparsi in giro, pero dovrebbe darti in $dati quello che ti serve...
    ...il SIMO
    :adhone:

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    20
    Simo intanto grazie mille x lo sforzo...

    il 1 errore riscontrato è nella dichiarazione dell'array dati:

    $dati = array[];

    Parse error: syntax error, unexpected '[', expecting '(' in /var/www/portale/Script_RegExp/script_prova3.php on line 4

    ho sostituito con:

    $dati = array();

    poi ho provato a fare sia all'interno del ciclo che fuori:

    print $dati;

    ma l'output è:
    Arrayroot@host-phy-01:/var/www/portale/Script_RegExp#

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.