Ricerca stringa con carattere jolly

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Buongiorno eccomi qua sperandoc he sia l'ultimo quesito(ma non credo :hammer:) di questo script

In sostanza ho un file txt con dei dati predisposti rpessapoco così

TA1=3
TB1=5
SS1=NO
RR1=f
GG1=4

e poi si ripete
TA2=4
TB2=6
SS2=NO
RR2=f
GG2=4

e si ripete ancora ............

Ora tramite unos cript precedente ricavo due numeri e da questo devo trovare una stringa corrsipondente a TA e verificare che in TB ci sia il secondo numero e modificare SS in relazione. Senza tener conto se si tratta di TA1 o TA2.

Ho fatto una prova con preg_match


PHP:
$var=3; 
$var2=5;
$mah="TA1=".$var; 
$ce=preg_match("/(TA)?(=$var)/i",$mah);

e mi restituisce1 quindi penso di essermia vvicinato perlomeno alla soluzione del carattere jolly. ma non riescoa far entrare sta cosa nel ciclo di lettura del file

In sostanza lo script deve fare questo

aprire il file cercare la stringa dove TA(carattere jolly,che sia 1 2 o 3 non importa)=($var) una volta trovata deve leggere la riga successiva e verificare che TB(carattere jolly)=$var2 e modificarmi ss(indipendentemente se presenta 1 2 o3) da NO a SI

Help to me
 
Con molta fatica ce la sto facendo mo so icneppato a come verificare al riga successiva

PHP:
foreach($data as $i => $riga){
   for($p=1; $p <= $pos; $p++){
$k=$i+1;
$ce=preg_match("/TA".$p."=".$var."/i",$riga);
if($ce=='1'){

echo $k."-".$ce."<br />";
}
}

  

    }

così mi isola i vari TA?=variabile e mi identifica la riga, (che credo eprò dovrei associare) ora mi basterebbe
vedere se la riga successiva

PHP:
 $ce2=preg_match("/TB".$p."=".$var."/i",$riga);
è uguale a 1
ed ho quasi terminato
HELP
 
ciao
scusa ma non ho capito bene cosa devi fare, correggimi se sbaglio:
$data è un array che contiene le varie righe, es.
$data[0] = "TA1=3"
$data[1] = "TB1=5"
$data[2] = "SS1=NO"
$data[3] = "RR1=f"
$data[4] = "GG1=4"
$data[5] = "TA2=4"
$data[6] = "TB2=6"
$data[7] = "SS2=NO"
$data[8] = "RR2=f"
$data[9] = "GG2=4"
ecc...ecc...
e se data[0] e data[1] rispettano entrambe il preg vuoi aggiornare data[2] = "SS1=SI"
se è così non puoi usare i forech ma un ciclo for un po' particolare, provo a farti un esempio (scrivo quasi in pseudocodice)
PHP:
<?php
$num_elementi=count($data); //conti quanti sono gli elementi dell'array
//ciclo for
for($k=0; $k < $num_elementi; $k=$k+5){//leggi sempre il primo elemento di ciascun gruppo: $k==0, ==5, ==10 ecc...
	//fai il preg dell'elemeto $data[$k] TAx=55
	if($ce_0=='1'){
		echo //....
	}
	//il preg dell'elemento $data[$k+1] TBx=77
	if($ce_1=='1'){
		echo //....
	}
	if($ce_0=='1' && $ce_1=='1'){
		//aggiorni l'elemento SSx=SI
	}
}
?>
se ho capito male sorry

p.s.
se fai partire gli array dall'indice 1 il for diventa $k=1; $k <= $num_elementi
 
no borgo

più che altro sono io che mi sto spiegando male, perchè ogni volta che riesco fare qualcosa domando solo epr il paso che mi blocca

però ogni tuo suggeriemnto mi sta facendo avvicinare.

in realtà le stringhe sono un pò più complesse non so come spiegarti,

ci provo speigandoti cos'è questo file:

Il file in questione serve per la compilazione di classifiche e calendari di un campionato di calcio

Nel file sono presenti dei blocchi

ci sono tanti blocchi quanti Round espressi da una variabile nelle prime righe del file
es Round =8
mi da 8 blocchi di round

quei ta1 TA2 TA3 TA4 non sono altro che gli incontri della giornata quindi se ci sono 8 squadre ci saranno 4 incontri per giornata se ci sono 10 suqadre nel round ci saranno 5 TA e 5 TB e così via.

IO non voglio far altro che trovare cheun valore espresso tra TAx e quello di TBx siano uguali(nellos tesso round) ai valori che gli invio io, indipendentemente dall'incontro e dal round.

una volta trovata la corrispondenza faccio partire lo script.

Però pensavo di esserci riuscito ed invece no mi serve ricavarne anche il round.

In sostanza devo isolare i vari round verificare la corrispondeza tra ta e tb del round e modificare le due righe successive GA e GB, ma devo anche conservare il numero del round.

ci sarei quasi riuscito con

PHP:
$data = file($file);
$soc=8; 
$var=6;
$var1=8;
$pos=($soc/2);
$totgiorn=(($soc-1)*2);
     for($totg=1; $totg <= $totgiorn; $totg++){
$round="[Round".$totg."]";

$righe_round=(($pos*8)+2);

$d=array();
foreach($data as $i => $riga){
    if (strstr($riga,$round)){

        for($k=3; $k <= $righe_round; $k++){//se vuoi partire da 1 sino, in questo caso, a 50
            $indice=$i+$k;
            $d[$indice]= $data[$indice]; //questo per mantenere la corrispondenza es. $d[33]=$data[33]
		echo $d[$indice]."<br>";
in pratica apro il file creo l'array e faccio leggere partendo da [Round x] saltanto le prime due righe del dopo Round.
$d[indice] mi restituisce tutte le righe presenti nei vari round ma non riesco a fare le verifiche su queste righe (mi frega sempre il carattere jolly per il numero dopo TA, che non ho modo di conoscerlo e che comunque non mi serve)e modificarle e nemmeno a conservare il round

ci sto provando or ora
 
Ultima modifica:
ciao
stavo per risponderti quando ho visto che ci sei quasi arrivato, eventualmente aspetto a piè fermo l'altro problema:byebye:

bè ci sono risucito anche a modificare la riga, pian pianellos to diventando un genio ;)

mi ha dato lo spunto quel

PHP:
 if($ce_0=='1' && $ce_1=='1'){
        //aggiorni l'elemento SSx=SI
    }

comunqeu era sbagliato il preg

PHP:
		for($p=1; $p <= $pos; $p++){
$ce_1=preg_match("/TA".$p."=".$ta."/i",$round_tot);
if($cea==1){//fissando $ce_0==1 ho riciclato per trovare $ce_1
......altro codice
		for($pb=1; $pb <= $posb; $pb++){	
		echo $ta;
$ce_1=preg_match("/TB".$pb."=".$tb."/i",$Round);

ho ciclato i round poi sempre nel foreach dei round ho ciclato per arrivare a $ce_0 e ho salvato in una variabile i vari round, perchè poteva capitare(ed infatti è capitato) che TA1 era in più round, con fforeach ho ricomnciato il giro ed ho trovato $ce_0 esalvato il round($totg) $p il poi ho riletto il file partendo dal Round($totg) e sempre con i vari cicli aperti ho ricercato $ce_1 e salvato $pb.

poi ho fatto un semplice if

PHP:
if($ce_1==1 && $p==$pb){

et voilà mi son fatto restituire sia la riga che il numero di riga epoi ho semplicemente operato una sopstituzione con il round $totg sono riaprtito dalla 3 riga e sono andato a sostituire GA


insomma persorso lunghisimo ma dopo bene due anni sono risucito a modificare quel file.

l'avevo sempre accantonato ogni volta perchè credevo fosse troppo difficile ma alla fine ce l'ho fatta.

Molto probabilemnte c'er aun metodo più veloce ma mi ritengo soddisfatto ugualemnte dato che non ho studiato programmazione ma è solo una passione nata da un paio di anni.

L'altro quesito riguarda la sovrascrittura della riga ma ci sono arrivato da solo.

Grazie los tesso

come sempre siete sempre i più cordiali ed i più utili.

Complimenti epr il lavoro che svolgete. :fonzie:

a breve ne ho qualche altra ;)
 
ciao
:fonzie:
una piccola domanda, stai lavorando con un file txt?
se si perche non usi mysql penso che sarebbe oltremodo più semplice (ma forse sbaglio)
 
ciao
:fonzie:
una piccola domanda, stai lavorando con un file txt?
se si perche non usi mysql penso che sarebbe oltremodo più semplice (ma forse sbaglio)

nono non sia mai

Quel file txt viene d aun altro script molto ma molto complesso che uso, e volevo modificarlo in base alle mie esigenze.

Come database mysql tutta la vita.

Credoc he lavorare con i file txt è pura follia
 

Discussioni simili