Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 19/05/10, 00:15:03
Array

[xs_avatar]
diamant-x diamant-x no está en línea
Usuario muy activo
 
Fecha de registro: ago 2008
Mensajes: 1,549

Como leer y tratar texto multilinea

Hola,
Hasta ahora me había apañado navegando y buscando mucho por internet pero no soy capaz de encontrar respuesta a esta pregunta.

Tengo un archivo de texto con múltiples lineas. Este texto no presenta ninguna forma recurrente con el que poder parsear al estilo JSON, o XML. Con que tipo de variables puedo tratar dicho texto para poder hacer cosas?
Si intento guarda el contenido en un String sólo obeingo la primera linea, lo mismo con CharSequence,... no he probado StringBuilder pues no se como usarlo.

Alguien puede echarme una mano? Gracias.
__________________
.
Responder Con Cita


  #2  
Viejo 30/05/10, 14:43:52
Array

[xs_avatar]
diamant-x diamant-x no está en línea
Usuario muy activo
 
Fecha de registro: ago 2008
Mensajes: 1,549

He indagado y por lo visto el sistema es leer todo el contenido en un BufferedReader, e ir importando cada linea al String en cuestión a base de reader.ReadLine().

Ahora sólo me queda saber como parsear texto en busca de palabras concretas y que me devuelva su posición ^^'. Alguien por aquí tiene alguna mínima noción de si existe alguna comanda en concreto o voy a tener que currarme toda una función desde cero para dicho cometido? ^^'
__________________
.
Responder Con Cita
  #3  
Viejo 30/05/10, 15:30:37
Array

[xs_avatar]
Capitan Trueno Capitan Trueno no está en línea
Miembro del foro
 
Fecha de registro: oct 2009
Localización: Valencia
Mensajes: 168
Modelo de smartphone: Gogle Nexus S
Tu operador: Pepephone
 Cita: Originalmente Escrito por diamant-x Ver Mensaje
He indagado y por lo visto el sistema es leer todo el contenido en un BufferedReader, e ir importando cada linea al String en cuestión a base de reader.ReadLine().

Ahora sólo me queda saber como parsear texto en busca de palabras concretas y que me devuelva su posición ^^'. Alguien por aquí tiene alguna mínima noción de si existe alguna comanda en concreto o voy a tener que currarme toda una función desde cero para dicho cometido? ^^'
Hola,
si no me equivoco, puedes probar con la función 'indexOf'. Cualquier String puede hacer uso de ella:

String miString = reader.readString();
int indice = miString.indexOf("cadena");
if ( índice != null ) {
String valor = miString.substring(indice, 6);
} else {
// miString no contiene el texto 'cadena'
}

Un saludo!
Responder Con Cita
Gracias de parte de:
  #4  
Viejo 30/05/10, 16:42:24
Array

[xs_avatar]
diamant-x diamant-x no está en línea
Usuario muy activo
 
Fecha de registro: ago 2008
Mensajes: 1,549

Wo, gracias por la referencia.
Pero y si ese texto "cadena" aparece más de una vez en la String, supongo que no te lo indica y simplemente tendras qu eir ejecutando un indexOf("cadena", posicion_primera_cadena) hasta que devuelva -1, no?

Miraré a ver que tal, gracias! ^^
__________________
.
Responder Con Cita
  #5  
Viejo 30/05/10, 17:33:07
Array

[xs_avatar]
Capitan Trueno Capitan Trueno no está en línea
Miembro del foro
 
Fecha de registro: oct 2009
Localización: Valencia
Mensajes: 168
Modelo de smartphone: Gogle Nexus S
Tu operador: Pepephone
 Cita: Originalmente Escrito por diamant-x Ver Mensaje
Wo, gracias por la referencia.
Pero y si ese texto "cadena" aparece más de una vez en la String, supongo que no te lo indica y simplemente tendras qu eir ejecutando un indexOf("cadena", posicion_primera_cadena) hasta que devuelva -1, no?

Miraré a ver que tal, gracias! ^^
Hola,

me parece que no, sólo te devuelve la primera ocurrencia. Mételo dentro de un bucle y haz un debug para probarlo.

Un saludo!
Responder Con Cita
Gracias de parte de:
  #6  
Viejo 12/06/10, 03:32:15
Array

[xs_avatar]
diamant-x diamant-x no está en línea
Usuario muy activo
 
Fecha de registro: ago 2008
Mensajes: 1,549

 Cita: Originalmente Escrito por Capitan Trueno Ver Mensaje
Hola,

me parece que no, sólo te devuelve la primera ocurrencia. Mételo dentro de un bucle y haz un debug para probarlo.

Un saludo!
Hola, Bueno he sacado algo de tiempo (las mejores horas para programar siempre son por la noche ) y he comprobado que a diferencia de lo que pensabamos, IndexOf devuelve la ULTIMA ocurrencia empezando dsd el principio del string.
Existe otra comanda ke es LastIndexof que devuelve la primera ocurrencia pero empieza a buscar de atrás para adelante.. :S

Ya me romperé el coco mañana para ver como me lo monto para que vaya uno a uno ke es lo que quiero ^^'
__________________
.
Responder Con Cita
  #7  
Viejo 12/06/10, 13:39:10
Array

[xs_avatar]
Capitan Trueno Capitan Trueno no está en línea
Miembro del foro
 
Fecha de registro: oct 2009
Localización: Valencia
Mensajes: 168
Modelo de smartphone: Gogle Nexus S
Tu operador: Pepephone
 Cita: Originalmente Escrito por diamant-x Ver Mensaje
Hola, Bueno he sacado algo de tiempo (las mejores horas para programar siempre son por la noche ) y he comprobado que a diferencia de lo que pensabamos, IndexOf devuelve la ULTIMA ocurrencia empezando dsd el principio del string.
Existe otra comanda ke es LastIndexof que devuelve la primera ocurrencia pero empieza a buscar de atrás para adelante.. :S

Ya me romperé el coco mañana para ver como me lo monto para que vaya uno a uno ke es lo que quiero ^^'
Hola,

¿estás seguro de eso? A mi me suena que para en la primera ocurrencia... No he tenido tiempo de montar un ejemplo de prueba, pero he encontrado a alguien que sí lo ha hecho, pégale un vistazo y ya cuentas cómo has quedado

Un saludo!
Ir al link original: http://lineadecodigo.com/java/contador-de-ocurrencias-en-java



Responder Con Cita
Gracias de parte de:
  #8  
Viejo 12/06/10, 14:41:44
Array

[xs_avatar]
diamant-x diamant-x no está en línea
Usuario muy activo
 
Fecha de registro: ago 2008
Mensajes: 1,549

He releido todas la funciones y veo que exactamente la función presenta algunos "problemas" segun que argumentos se introduzcan.

StringA.indexOf(StringB) devuelve la primera posicion de StringB empezando dsd el principio de StringA, pero la gracia es ir detectando las siguientes ocurrencias a partir de un punto, por lo que empleo StringA.indexOf(StringB, int_posicion_inicio) pero es cuando uso esta funcion que me devuelve la ultima ocurrencia :S

http://developer.android.com/referen...ring,%20int%29

Analizando el codigo de la web que has adjuntado veo que va particionando la String a medida ke vaya encontrando la palabra clave, pero eso no puede generar un consumo de CPU muy elevado ?

Edito: Efectivamente, así lo he hecho con el procedimiento ke usan en ese fragmento de ir "recortando" el string original y funciona bien. aunque tarda un poquito para mi gusto, pero supongo ke es porque la cadena original presenta muchas ocurrencias. Pero bueno, funciona, que es lo que quiero .
Gracias! Si sabes de algun otro método que no involucre el "recortar" la cadena y pueda acelerar el proceso se agradeceria :P.
__________________
.

Última edición por diamant-x Día 12/06/10 a las 15:30:43.
Responder Con Cita
  #9  
Viejo 12/06/10, 21:07:12
Array

[xs_avatar]
Capitan Trueno Capitan Trueno no está en línea
Miembro del foro
 
Fecha de registro: oct 2009
Localización: Valencia
Mensajes: 168
Modelo de smartphone: Gogle Nexus S
Tu operador: Pepephone
Me alegra que Lo hayas resuelto
Responder Con Cita
  #10  
Viejo 17/06/10, 10:21:48
Array

[xs_avatar]
ocapocap ocapocap no está en línea
Usuario novato en la web
 
Fecha de registro: jun 2010
Mensajes: 17
Modelo de smartphone: HTC Hero

Buscar todas las ocurrencias de una cadena

Como bien indicáis, el método indexOf tiene un segundo parámetro que es la posición de inicio en la que queremos buscar, así que lo único que hay que hacer es modificar ese valor con la posición de la ocurrencia anterior.

Si no se encuentra, retorna un valor -1.

Así que podríamos emplear el siguiente código:

int pos = cadena.indexOf(buscar);
while (pos != -1) {
... // Hacer lo que sea con la posición pos
// Seguimos buscando...
pos = cadena.indexOf(buscar, pos + buscar.length());
}

Si en la búsqueda no quieres tener en cuenta mayúsculas y minúsculas, emplea

cadena.toUpperCase().indexOf(buscar.toUpperCase())

Un saludo
Responder Con Cita
  #11  
Viejo 18/06/10, 16:00:47
Array

[xs_avatar]
diamant-x diamant-x no está en línea
Usuario muy activo
 
Fecha de registro: ago 2008
Mensajes: 1,549

 Cita: Originalmente Escrito por ocapocap Ver Mensaje
Como bien indicáis, el método indexOf tiene un segundo parámetro que es la posición de inicio en la que queremos buscar, así que lo único que hay que hacer es modificar ese valor con la posición de la ocurrencia anterior.

Si no se encuentra, retorna un valor -1.

Así que podríamos emplear el siguiente código:

int pos = cadena.indexOf(buscar);
while (pos != -1) {
... // Hacer lo que sea con la posición pos
// Seguimos buscando...
pos = cadena.indexOf(buscar, pos + buscar.length());
}

Si en la búsqueda no quieres tener en cuenta mayúsculas y minúsculas, emplea

cadena.toUpperCase().indexOf(buscar.toUpperCase())

Un saludo
Pero haciendo eso pasa lo que comentaba antes:

 Cita:
StringA.indexOf(StringB) devuelve la primera posicion de StringB empezando dsd el principio de StringA, [...]

empleo StringA.indexOf(StringB, int_posicion_inicio) pero es cuando uso esta funcion que me devuelve la ultima ocurrencia
po rlo que, sin compilar, diria que tu codigo me fallarà en cuanto intente encontrar mas de 2 veces "buscar", Ya que la primera vez me lo encontrarà la primera ya que usas indexOf(buscar), pero las siguientes estas usando indexOf(buscar, int) donde al añadirle ese segundo argumento la funcion indexOf deja de devolver la primera ocurrencia y nos devuelve la última, por lo que en tu codigo al buscar "buscar" por segunda vez nos devolverá directamente la ultima ocurrencia de buscar, omitiendo cualquier otra vez que pudiese aparecer y acabando la funcion siempre con dos "buscar" encontrados.

----------------
Estoy escuchando: Haddaway – What Is Love en mi Spotify via FoxyTunes
__________________
.
Responder Con Cita
  #12  
Viejo 18/06/10, 22:08:28
Array

[xs_avatar]
ocapocap ocapocap no está en línea
Usuario novato en la web
 
Fecha de registro: jun 2010
Mensajes: 17
Modelo de smartphone: HTC Hero

Buscar varias ocurrencias

El código funciona correctamente. La función indexOf(campo, pos) busca la primera aparición del campo a partir de la posición pos, por lo que si la cadena "campo" aparece varias veces, el código de ejemplo te encontrará todas ellas.

Pruébalo que ya verás como funciona.

Un saludo
Responder Con Cita
  #13  
Viejo 18/06/10, 22:22:53
Array

[xs_avatar]
Capitan Trueno Capitan Trueno no está en línea
Miembro del foro
 
Fecha de registro: oct 2009
Localización: Valencia
Mensajes: 168
Modelo de smartphone: Gogle Nexus S
Tu operador: Pepephone
 Cita: Originalmente Escrito por diamant-x Ver Mensaje
Pero haciendo eso pasa lo que comentaba antes:



po rlo que, sin compilar, diria que tu codigo me fallarà en cuanto intente encontrar mas de 2 veces "buscar", Ya que la primera vez me lo encontrarà la primera ya que usas indexOf(buscar), pero las siguientes estas usando indexOf(buscar, int) donde al añadirle ese segundo argumento la funcion indexOf deja de devolver la primera ocurrencia y nos devuelve la última, por lo que en tu codigo al buscar "buscar" por segunda vez nos devolverá directamente la ultima ocurrencia de buscar, omitiendo cualquier otra vez que pudiese aparecer y acabando la funcion siempre con dos "buscar" encontrados.

----------------
Estoy escuchando: Haddaway – What Is Love en mi Spotify via FoxyTunes

Hola,

he modificado el código del ejemplo que te enlacé para que veas cómo se comporta. El código es esté:
Código:
public class ContadorDePalabras {
    
    public static void main(String[] args) {
        
        // Texto
        String sTexto = "palabra o palabra y palabra";
        // Texto que vamos a buscar
        String sTextoBuscado = "palabra";
        // Contador de ocurrencias 
            int contador = 0;
        // Contador de caracteres recorridos sTextoBuscado
            int posicionActual = 0;
            int posicionFinal = 0;

        System.out.println("Cadena Origen: "+ sTexto);
        System.out.println("\nCadena a buscar: "+ sTextoBuscado);

            while (sTexto.indexOf(sTextoBuscado) > -1) {
          posicionActual += sTexto.indexOf(sTextoBuscado);
          posicionFinal = posicionActual + sTextoBuscado.length();
          contador++; 
          System.out.println("\nOcurrencia n."+contador);
          System.out.println("\n\t=>Del caracter "+ posicionActual +" al caracter "+ posicionFinal);
          sTexto = sTexto.substring(sTexto.indexOf(
          sTextoBuscado)+sTextoBuscado.length(),sTexto.length());

          posicionActual = posicionFinal;
        }
        
        System.out.println (contador);
    }
}
Y los resultados que ofrece son éstos:
Código:
C:\Users\CT>java ContadorDePalabras
Cadena Origen: palabra o palabra y palabra

Cadena a buscar: palabra

     Ocurrencia n.1

             =>Del caracter 0 al caracter 7

     Ocurrencia n.2

             =>Del caracter 10 al caracter 17

     Ocurrencia n.3

             =>Del caracter 20 al caracter 27

     Ocurrencias TOTALES: 3
Adjunto el fichero java para que lo modifiques y hagas las pruebas que necesites. Para compilarlo y ejecutarlo, pues los pasos de siempre y donde siempre. Puedes compilarlo desde un terminal de Linux o de una consola de MS-DOS de Windows, con un simple
Código:
javac ContadorDePalabras.java
.

Para ejecutarlo simplemente escribe
Código:
java ContadorDePalabras
Espero que estos resultados, te sirvan para tu propósito.

Un saludo!
Archivos Adjuntos
Tipo de Archivo: txt ContadorDePalabras.java.txt (1.4 KB, 0 visitas)
Responder Con Cita
  #14  
Viejo 18/06/10, 22:46:07
Array

[xs_avatar]
diamant-x diamant-x no está en línea
Usuario muy activo
 
Fecha de registro: ago 2008
Mensajes: 1,549

Si si, si con el procedimiento de recortar la string me va de perlas como ya comenté, pero si aplicamos el método de ocapocap sólo me devolvia la ultima entrada a partir de la posicion pos.

Tal y como se ve en el enlace al androdi developers:
 Cita:
public int indexOf (String subString, int start)

Searches in this string for the index of the specified string.
Mientras que con un solo argumento:
 Cita:
public int indexOf (String string)

Searches in this string for the first index of the specified string.
__________________
.
Responder Con Cita
  #15  
Viejo 19/06/10, 11:19:32
Array

[xs_avatar]
ocapocap ocapocap no está en línea
Usuario novato en la web
 
Fecha de registro: jun 2010
Mensajes: 17
Modelo de smartphone: HTC Hero

Prueba indexOf

Hola de nuevo,

El indexOf funciona tal y como te he dicho. El código que he utilizado:

Código:
buscar = (EditText) this.findViewById(R.id.EditText01);
        texto = (TextView) findViewById(R.id.TextView01);
        texto.setText("Esto es un texto de prueba.\nEsto es un texto de prueba.\nEsto es un texto de prueba.\nEsto es un texto de prueba");
        resultado = (TextView) findViewById(R.id.TextView02);
        findViewById(R.id.Button01).setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            	String cadena = texto.getText().toString();
            	String bus = buscar.getText().toString().toUpperCase();
            	int pos = cadena.toUpperCase().indexOf(bus);
            	String resp = "";
            	while (pos!=-1){
            		resp +="Encontrada en pos = " + pos + "\n";
            		pos = cadena.toUpperCase().indexOf(bus,pos+bus.length());
            	}
            	resultado.setText(resp);
            }
        });
Te adjunto el ejemplo. Espero que te sirva.

Un saludo
Imágenes Adjuntas
Tipo de Archivo: png PruebaIndexOf.png (24.0 KB, 43 visitas)
Archivos Adjuntos
Tipo de Archivo: zip PruebaIndexOf.zip (30.4 KB, 0 visitas)
Responder Con Cita
  #16  
Viejo 13/07/10, 14:42:53
Array

[xs_avatar]
SergioAndroid SergioAndroid no está en línea
Miembro del foro
· Votos compra/venta: (1)
 
Fecha de registro: abr 2010
Localización: Madrid
Mensajes: 238
Modelo de smartphone: Nexus One
Tu operador: Vodafone
Si pretendes encontrar patrones... siempre puedes usar expresiones regulares (son un poco puñeteras al principio, pero como te pase como a mi... ahora no sabria vivir sin ellas )
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 18:08:29 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /