[botta&risposta] Splittare una stringa

Tutorial, videotutorials ed esempi creati da noi
Rispondi
Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

[botta&risposta] Splittare una stringa

Messaggio da maz85 »

Mi serviva un modo per splittare una stringa attraverso un divisore e raccogliere i valori su un array.
In pratica la funzione restituisce il numero di elementi contenuti nell'array e nel mentre suddivide la stringa ed è presente in altri linguaggi di programmazione tipo PHP o VB, ma noi siamo ganzi e ci piace fare le funzioni bypassando pure la storia del passaggio array tramite reference.

Esempio:

stringa="a,b,c,d";
numeroelementi=split("array1",stringa,",");

Con questo codice l'array -array1- conterrà nella posizione 1 la stringa "a", nella pos 2 la stringa "b" e via dicendo.
Come divisore (",") si può usare anche una stringa con più di un carattere per esempio:

stringa="a<br>b<br>c<br>d";
numeroelementi=split("array1",stringa,"<br>");

Ecco qui il codice, create uno script chiamato split.

Codice: Seleziona tutto

USO:
//numeroelementi=split(nomearray,stringa,divisore);
numeroelementi=split("arrayprova",str_sorgente,"<ab>");
Sotto spoiler perchè deforma il layout :mrgreen:
Spoiler

Codice: Seleziona tutto

{
//Split
//by maz85
//divide una stringa sorgente attraverso un divisore e salva le vari parti
//in un array indicato (in questo caso LOCALE, ma basta cambiare funzione di SET)
//split(nomearray,stringa,divisore);
//divisore può essere anche una stringa tipo "<br>", ":::", "." ecc...

//init array 0-"" cominciamo dall'1 (si, consumiamo indirizzi in memoria)
variable_local_array_set(string(argument0),0,"");

var stringadadividere;
stringadadividere=argument1;

var divisore;
divisore=argument2;

var ottenibili;
ottenibili=string_count(divisore,stringadadividere)+1;

//Otteniamo quanti valori dobbiamo ottere in un testo tipo
var stringatemp;
stringatemp=stringadadividere; 

for(i=1; i<=ottenibili; i+=1){
    //prima occorrenza del divisore
    var occ;
    occ=string_pos(divisore,stringatemp);
    var valuetemp;
    if(occ==0){
        //no occorrenze
        valuetemp=stringatemp;
    }else{
        valuetemp=string_copy(stringatemp,0,occ-1);
    }
    if(valuetemp!=""){
    variable_local_array_set(string(argument0),i,valuetemp); 
    //ridefinizione
    stringatemp=string_copy(stringatemp,occ+string_length(divisore),string_length(stringatemp)-string_length(variable_local_array_get(string(argument0),i)));
    }
}
return ottenibili; //restituisco il numero di elementi trovati

}
Lo aggiungo più tardi su Snippet.

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [botta&risposta] Splittare una stringa

Messaggio da Jak »

Perfetta! Proprio la funzione adatta per avere facilmente vari elementi da un file di testo esterno così da non fare migliaia di file direttamente! Sei il migliore maz :first: !
Ma cos'è questo "SNIPPET" :?:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [botta&risposta] Splittare una stringa

Messaggio da maz85 »

Raccolta codici brevi, insomma script in GML da usare subito: http://gmitalia.altervista.org/portale/ ... e=Articoli
Leggi "attivazione sezione". ;)
Si, è molto utile come funzione, soprattutto per prendere in input file di configurazione, liste e altro.

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [botta&risposta] Splittare una stringa

Messaggio da Jak »

Grazie per la risposta!
EDIT: Non ha senso mettere:

if(occ==0){
//no occorrenze
valuetemp=string_copy(stringatemp,0,string_length(stringatemp));
sarebbe meglio e più semplice:
if(occ==0){
valuetemp=stringatemp;
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
BaronVsCorsar
GMI VIP
Messaggi: 4699
Iscritto il: 14/02/2004, 12:05
Specialità: Saccenza
Uso: GameMaker 8.1
Località: Ferrara
Contatta:

Re: [botta&risposta] Splittare una stringa

Messaggio da BaronVsCorsar »

ImmagineSchiva questo - http:\\baronvscorsar.altervista.org
by Lego: Vado in un bar e faccio "votiamo che quel tizio la in fondo venga buttato fuori", ma perché?

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [botta&risposta] Splittare una stringa

Messaggio da maz85 »

Ah, non me lo ricordavo Baron. :oops:
@Jack: si, tanto il restante è uguale. Dopo edito. ;)

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: [botta&risposta] Splittare una stringa

Messaggio da Jak »

Sarebbe utile aggiungere un'argomento per indicare se scrivere o no il separatore sull'array e/o se aggiungere una stringa dove ci sono occorrenze! (sarebbe utile per fare andare a capo automaticamente il testo all'ultima occorrenza di spazio prima della fine della riga ecc...). Appena la faccio la posto!
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 67 ospiti