Newsgroup: it.comp.www.php
Titolo: Trasformazione di un file

Sono in grado di modificare qualcosa, ma realizzarlo exnovo proprio non 
sono capace perchè mi occupo di altro. Per cui chiedo aiuto nel 
realizzare quanto segue.
Ho un file di testo composto da tante righe.
Ogni riga è fatta così:
ggmmaa hhmm|rosso|verde|giallo|blu|nero
ggmmaa hhmm|rosso|verde|giallo|blu|bianco
ggmmaa hhmm|rosso|verde|giallo|blu|grigio
dovrei creare uno script che ogni N minuti (questo lo faccio con 
CRONJOB) mi prende il file, me lo "confeziona" e me lo spara fuori così:
riga(0,rosso,verde,'giallo','ggmm hhmm');
riga(1,rosso,verde,'giallo','ggmm hhmm');
riga(2,rosso,verde,'giallo','ggmm hhmm');
Avrei bisogno di qualche esempio già fatto o simile.
grazie

 riga(2,rosso,verde,'giallo','ggmm hhmm');
$fp = fopen(...);
$count = 0;
while(!feof($fp)){
    $linea = fgets($fp,256);
    $parti = explode("|",$linea);
    ...
    $count++;
}
fclose($fp);
La variabile $parti è un array che contiene gli elementi di ogni riga, ad 
esempio:
$part[0] => ggmmaa hhmm
$part[1] => rosso
$part[2] => verde
$part[3] => giallo
$part[4] => blu
$part[5] => nero
A questo punto, al posto dei puntini, crei la nuova riga come vuoi tu.
E ne fai l'uso che ti pare.
Ciao
Marco 

 
Consiglerei di usare 'file' e poi un ciclo 'foreach'. Inoltre sfutterei 
delle chiavi significative..
tipo
$file=file('path/to/file_da_aprire.ext');
foreach ($file as $valore) {
	$temp=explode("|",trim($valore));
	$temp1=explode(" ",temp[0]);
	$dati[]=array('data' => substr($temp1[0],0,4), 'ora' => $temp1[1], 
'col1' => $temp[1], 'col2' => $temp[2], 'col3' => $temp[3], 'col4' => 
$temp[4], 'col5' => $temp[5]);
}
quindi per ottenere cio che è richiesto basta fare così:
foreach ($dati as $chiave => $valore) {
	print 
("riga($chiave,{$valore['col1']},{$valore['col2']},{$valore['col2']},'{$valore['col3']}','{$valore['data']} 
{$valore['ora]}');\n")
}
o qualcosa del genere.
Non testato

io lo farei in awk... guarda nel manuale e' veramente banale
qui c'e' un tutorial:
http://www.vectorsite.net/tsawk.html

 E ne fai l'uso che ti pare.
grazie Marco per avermi dato delle dritte ma le mie conoscenze del 
linguaggio non mi permettono di andare molto lontano.
Prova a farmi un esempio con due campi solamente separati da un |
così forse potrei avvicinarmi alla soluzione.

 	$temp1=explode(" ",temp[0]);
Ho provato il tuo consiglio ma alla riga qui sopra mi da
Parse error: parse error, unexpected
Mi piace molto il dettaglio dell'output e se riuscesse ad andare sarebbe 
fantastico.
Grazie

 
http://www.vectorsite.net/tsawk.html
Scusa la mia ignoranza, ma di cosa stiamo parlando ? awk?

>	$temp1=explode(" ",temp[0]);
Ho dimenticato un $ sorry
$temp1=explode(" ",$temp[0]);

 cosě forse potrei avvicinarmi alla soluzione.
$fp = fopen(...);
$count = 0;
while(!feof($fp)){
    $linea = fgets($fp,256);
    $parti = explode("|",$linea);
    $nuovaLinea = "riga(" . $count . "," . $parti[1] . "," .
                  $parti[2] . ",'" . $parti[3] . "','" . $parti[0] . "');";
    // poi decidi cosa farne della nuova linea
    $count++;
}
fclose($fp);
Ciao
Marco 

 $temp1=explode(" ",$temp[0]);
Non gli piace questa riga


Ghianda ha scritto:

lol, mi scuso se ho comemsso troppi errori.
Ma parti proprio da 0?
Vabbé
in realtà quella riga è il seguito della precedente (c'è uno spazio in 
mezzo) e manca il ; finale
quindi:
.... '{$valore['data']} {$valore['ora]}');\n");
o qlcs del genere. Ciao

Magilla ha scritto:
aspé va


Ci siamo quasi.
Inserendo questo:
$fp = fopen("file.txt","r");  
e aggiungendo questo
print ("$nuovaLinea");
mi mostra una sola riga, l'ultima.
Se ho 3 righe mi scrive:
riga(3,rosso,,'','verde');
Mi spieghi come potrei fare a mostrare tutte le righe con la numerazione 
progressiva corretta ?
grazie ancora.

 > .... '{$valore['data']} {$valore['ora']}');\n");
Con l'ultima modifica mi da questo errore alla fine del file senza mostrarmi 
nulla.
Parse error: parse error, unexpected $ in......
<?
$file=file("file.txt","r");
foreach ($file as $valore) {
$temp=explode("|",trim($valore));
$temp1=explode(" ",$temp[0]);
$dati[]=array('data' => substr($temp1[0],0,4), 'ora' => $temp1[1],'col1' => 
$temp[1], 'col2' => $temp[2], 'col3' => $temp[3], 'col4' => $temp[4], 'col5' => 
$temp[5]);
}
foreach ($dati as $chiave => $valore) {
print ("riga($chiave,{$valore['col1']},{$valore['col2']},{$valore['col2']},
'{$valore['col3']}','{$valore['data']} {$valore['ora']}');\n");
 ?>

 
Visto i vari errori (dei quali mi scuso) mi sono deciso a testare la cosa.
questo il file test.dat
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
ggmmaa hhmm|rosso|verde|giallo|blu|nero
ggmmaa hhmm|rosso|verde|giallo|blu|bianco
ggmmaa hhmm|rosso|verde|giallo|blu|grigio
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
questo lo script test.php
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
<?
$file=file('test.dat');
foreach ($file as $valore) {
     $temp=explode("|",trim($valore));
     $temp1=explode(" ",$temp[0]);
     $dati[]=array('data' => substr($temp1[0],0,4), 'ora' => $temp1[1], 
'col1' => $temp[1], 'col2' => $temp[2], 'col3' => $temp[3], 'col4' => 
$temp[4], 'col5' => $temp[5]);
/*
qui sopra c'è un unica riga, che parte da $dati[]=
dentro al foreach ci sono 3 istruzioni
*/
}
//quindi per ottenere cio che è richiesto basta fare così:
foreach ($dati as $chiave => $valore) {
     print 
("riga($chiave,{$valore['col1']},{$valore['col2']},{$valore['col2']},'{$valore['col3']}','{$valore['data']} 
{$valore['ora']}');\n");
/*come dicevo questa riga inizia dal print, ovvero dentro al foreach c'è 
un unica istruzione*/
}
?>
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
questo l'output dello script:
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
 >php -f "test.php"
riga(0,rosso,verde,verde,'giallo','ggmm hhmm');
riga(1,rosso,verde,verde,'giallo','ggmm hhmm');
riga(2,rosso,verde,verde,'giallo','ggmm hhmm');
 >Exit code: 0
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
e questo il risultato di 'print_r' di $dati, che è una matrice (array 
bidimensionale)
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
Array
(
     [0] => Array
         (
             [data] => ggmm
             [ora] => hhmm
             [col1] => rosso
             [col2] => verde
             [col3] => giallo
             [col4] => blu
             [col5] => nero
         )
     [1] => Array
         (
             [data] => ggmm
             [ora] => hhmm
             [col1] => rosso
             [col2] => verde
             [col3] => giallo
             [col4] => blu
             [col5] => bianco
         )
     [2] => Array
         (
             [data] => ggmm
             [ora] => hhmm
             [col1] => rosso
             [col2] => verde
             [col3] => giallo
             [col4] => blu
             [col5] => grigio
         )
)
8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---
puoi accedere a questi dati così
print $dati[numero_riga][indice]
es.
print $dati[1]['col2']
restituisce "verde".
That's all.

 riga(3,rosso,,'','verde');
Dove la metti quell'istruzione?
La variabile $nuovaLinea č dentro al ciclo e quindi cambia il suo valore ad 
ogni iterazione.
Devi stamparla all'interno del ciclo:
while(!feof($fp)){
    $linea = fgets($fp,256);
    $parti = explode("|",$linea);
    $nuovaLinea = "riga(" . $count . "," . $parti[1] . "," .
                  $parti[2] . ",'" . $parti[3] . "','" . $parti[0] . "');";
    echo $nuovaLinea . "<br>\n";
    $count++;
}
Ciao
Marco 

Marco <na...@NOPRIVATEMESSAGE.com> ha scritto:
Ho avuto modo di provarlo solo ora e FUNZIONA!
Grazie per la tua collaborazione.

 ha scritto:
Una validissima alternativa a quella di Marco ed ora funziona, grazie anche a te 
Magilla.