Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: bygdle en Diciembre 04, 2015, 08:36:15 PM

Título: [Solucionado]Dividir una string en más sub-strings
Publicado por: bygdle en Diciembre 04, 2015, 08:36:15 PM
Hola, me dio por probar algo sencillo en el GM pero me estanqué a la primera :-[
Lo que necesito es "sencillo" de explicar, pero no de hacer...xD
tengo, por ejemplo, una string
[gml]
text= "Hola, soy una string";
[/gml]
Y quisiera que cada palabra se almacenara en diferentes variables (o arrays si se puede :D), debería quedar algo así:
[gml]
text = "Hola, soy una string";
separar_string();
palabra[1] = "hola";
palabra[2] = ",";
palabra[3] = "soy";
palabra[4] = "una";
palabra[5] = "string";

[/gml]
Como se puede apreciar en el ejemplo, necesito separar la cadena en más sub-cadenas, separando también los caracteres especiales como commas, puntos, signos matemáticos (+,-,*,/) y entre otros. Pero que las palabras no se separaran de las vocales tildadas, o sea:
[gml]
texto = "así se suma,+ así se resta,-"
palabra[1] = "así";
palabra[2] = "se";
palabra[3] = "suma";
palabra[4] = ",";
palabra[5] = "+";
palabra[6] = "así";
palabra[7] = "se";
palabra[8] = "resta";
palabra[9] = ",";
palabra[10] = "-";
[/gml]

A ver si me expliqué... :D
Título: Re:Dividir una string en más sub-strings
Publicado por: jmbs19 en Diciembre 04, 2015, 08:49:04 PM
te diria que usaras un xplode usando " " como divisor, pero lo veo dificil en el caso de las comas, script de xplode hay varios en el foro, pero no se me ocurre una manera de separar tambien las "," de las palabras.
Título: Re:Dividir una string en más sub-strings
Publicado por: penumbra en Diciembre 05, 2015, 02:19:36 AM
La idea básica es usar un ciclo para ir recorriendo la cadena (for, while, repeat, se puede con cualquiera). Si no se encuentran espacios ni caracteres especiales, un contador va a cumulando el número de iteraciones. Cuando se encuentre un espacio, se consulta el valor del contador, ese valor contendría la longitud de la primera palabra en la cadena. Se usa el valor del contador para extraer la primera palabra de la cadena original y guardarla en el arreglo. Se aumentaría el índice del arreglo en 1 para pasar a la siguiente posición. El proceso se repetiría.

Para encontrar caracteres especiales, se pueden usar ifs dentro del ciclo, y preguntar si el caracter actual es igual a una coma, o punto, o signo +, etc. Si no se quiere usar muchos ifs o un switch, como alternativa se puede crear un arreglo que contenga todos los caracteres especiales (o su código ascii/utf-8) y mediante otro ciclo anidado, recorrer el arreglo para ver si el caracter actual corresponde a uno de los caracteres del arreglo. De ser así, se guarda el caracter en la siguiente posición del arreglo, el proceso dentro del ciclo anidado termina y se comenzará la siguiente iteración en el ciclo exterior.
Título: Re:Dividir una string en más sub-strings
Publicado por: jmbs19 en Diciembre 05, 2015, 02:34:24 AM
un explode dentro de otro explode, pues la idea de penumbra es muy buena realmente. ahora hay varios scripts explode en el foro e internet. yo mismo tengo uno que no se de donde saque, y curiosamente el script tiene una nota que dice en ingles que el tipo del que lo saque(que como ya dije no se quien o donde) tampoco sabe de donde lo saco  XD.

[gml]
/*
This part I didn't write. I have a stash of scripts I have collected over the years
and this was one of them. Unfortunately I don't know where I got it from.

So if you wrote this or you know who did please email me so I can assign credit.

Usage: string_explode(string, delimiter)

*/

var c, i, j, k, s;
s = "";
i = 0;
k = string_length(argument0);

for (j = 1; j <= k; j += 1)
{
    c = string_char_at(argument0, j);
    if (c == argument1)
    {
        level = s;
        s = "";
        i += 1;
        continue;
    }
    s = s + c;
}
if (s != "")
   level = s;
[/gml]

devuelve el resultado como un array de level con n numero de partes que tenga. se puede mejorar pero a mi me gusta asi y hasta ahora no e necesitado mejorarlo.

ps: no puedes usar un delimitador de mas de 1 caracter y el delimitador es borrado, es decir, si tengo "hola,como,estas" seria
level[0]="hola"
level[1]="como"
level[2]="estas"
Título: Re:Dividir una string en más sub-strings
Publicado por: Guacusio en Diciembre 05, 2015, 02:38:46 AM
Penumbra te dio una idea. Yo aporto también con otra forma de hacerlo. La idea básica es en primer lugar insertar un espacio en blanco delante de cada carácter especial, de modo que en la cadena original queden todas las "palabras" ya separadas por espacios. Para esto se puede crear una lista con todos los caracteres especiales y luego recorrer la lista al tiempo que se utiliza string_replace_all sobre la cadena original. Luego se explota el string con cualquier función que lo descomponga en palabras separadas por espacios. Llevando esto a código, sería:

texto="así se suma,+ así se resta,-";
e=ds_list_create();
ds_list_add(e,",",".","+","-",";","*","/");//caracteres especiales se guardan en una lista
for(i=0;i<ds_list_size(e);i++)
    texto=string_replace_all(texto,e[| i]," "+e[| i]);//inserta un espacio delante de los caracteres especiales
i=0;
while texto!=""
    {
    s=string_pos(" ",texto);//busca posición del primer espacio
    if s=0
        {
        palabra[i]=texto;//última palabra, no hay espacio en blanco
        texto="";
        }
    else
        {
        palabra[i]=string_copy(texto,1,s-1);//genera palabra
        while string_char_at(texto,s)=" " and s<=string_length(texto)
            s++;
        texto=string_delete(texto,1,s-1);//borra caracteres hasta antes de la próxima palabra
        }
    i++;
    }
ds_list_destroy(e);


Para ver el resultado:

m="";
for(j=0;j<i;j++)
    m+="palabra["+string(j)+"]="+palabra[j]+"#";
show_message(m);

Título: Re:Dividir una string en más sub-strings
Publicado por: bygdle en Diciembre 05, 2015, 09:37:52 PM
Muchas gracias Guacusio, como siempre tú con tus hermosos códigos traídos del cielo :D
[SOLUCIONADO!!!]