Autor Tema: Leer y mostar datos de un archivo txt en java estoy utilizando jgrasp  (Leído 5018 veces)

China

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 24
    • Ver Perfil
nesecito que me busque el dato y que muestre el adato buscado
Código: [Seleccionar]
File file = new File("C:\\Prueba\\EquipoV.txt");   
      Scanner lector;
      lector = new Scanner(System.in);
      String datoAbuscar;
      JOptionPane.showInputDialog("Dato a buscar:");
      datoAbuscar = lector.nextLine();
      lector = new Scanner(file);
         
          while (lector.hasNextLine()) {
            String datoBuscado = lector.nextLine();
         
               if (datoBuscado.startsWith(datoAbuscar)) {
                  JOptionPane.showMessageDialog(null,"Dato buscado\n" + datoBuscado);
                           }
                 while(datoBuscado!=("|"));   
            }

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Leer y mostar datos de un archivo txt en java estoy utilizando jgrasp
« Respuesta #1 en: 05 de Junio 2018, 13:55 »
Hola.
Nunca he usado la clase Scanner para leer ficheros, siempre he usado la calse BufferedReader.
Sin embargo, la mecánica viene a ser la misma.

Vamos por partes.

1.
Usas un JOptionPane para que el usuario introduzca el dato a buscar. ESto significa que ya no necesitas usar el Scanner para leer el dato a buscar, te lo proporciona directamente el JOptionPane si recoges el String que te está devolviendo.
Así que todo eso lo puedes hacer en una única linea. Te tacho las que no necesitas:
Citar
Scanner lector;
      lector = new Scanner(System.in);
      String datoAbuscar =  JOptionPane.showInputDialog("Dato a buscar:");
      datoAbuscar = lector.nextLine();

2.
SIEMPRE, pero SIEMPRE..... cuando queremos leer/escribir ficheros, estaremos obligados a controlar posibles excepciones (errores) que puedan ocurrir al acceder a estos ficheros.
No es opcional, Java nos obliga. Y además, es lo deseable.

Esto significa que la creacion del objeto Scanner para leer fichero las lectura a realizar, han de ir dentro de un try {}.....
seguido de un catch(){} donde le diremos que ha de hacer en caso de que ocurrar el posible error de no poder acceder al archivo, por ejemplo mostrar una ventana explicando el error.

Te destaco en verde el codigo que va dentro del try{} y en rojo el catch
Citar
try {
          Scanner lector = new Scanner(file);
         while (lector.hasNextLine()) {
            String datoBuscado = lector.nextLine();
            
            if (datoBuscado.startsWith(datoAbuscar)) {
                  JOptionPane.showMessageDialog(null,"Dato buscado\n" + datoBuscado);
                           }
                 while(datoBuscado!=("|"));
                 
               }
      }
catch (FileNotFoundException e) {
         JOptionPane.showMessageDialog(null, "No se ha encontrado el fichero " + file.getAbsolutePath());
         e.printStackTrace();//Muestra por consola la "traza" del error
      }

3.
Centrémonos en el código que hay dentro del try{}
Ahora mismo, con el código que pusiste, prácticamente ya estaríamos funcionando correctamente.
Solo comentar dos cosas:
- La linea:
Código: [Seleccionar]
while(datoBuscado!=("|"));No sirve para nada, excepto para provocar un bucle de duración infinito y bloquear el programa para toda la eternidad.
Elimínala. No se qué es lo que pretendías hacer en ese punto del código, pero sea lo que sea, esa línea no te sirve, ya que solo consigue bloquear el programa, ya que datoBuscado SIEMPRE será distinto de "|", excepto que el usuario haya indicado que quiere buscar ese caracter.

-Por último.
Si usamos los métodos .hasNextLine() y nextLine(), estaríamos leyendo lineas completas del archivo de texto.
Además estamos usando el método .startsWith() que nos dirá si la linea tiene al principio el mismo dato que estamos buscando.

Puede que eso sea lo que queramos. Pero tal vez queramos ser más precisos en las lecturas y en lugar de leer lineas enteras, queramos leer palabra por palabra.

Supon que el archivo txt donde estamos buscando, contiene este texto:
Citar
rojo azul verde amarillo
barcelona madrid granada
perro gato marmota

Con los métodos que estamos usando ahora mismo. Podríamos encontrar los datos "rojo", "barcelona" y "perro". Porque son los datos con los que comienzan las lineas y es lo que encontrará el método .startsWith()

Pero no seríamos capaces de encontrar el resto de datos: "azul", "granada", "marmota", etc... como no están al principio de la linea, el método .startsWith() no sabrá encontrarlos.

Esto podemos solucionarlo, usando el método contains(), en lugar de .startsWith()
Sustituimos lo tachado:
Citar
if (datoBuscado.startsWith(datoAbuscar)) {
                  JOptionPane.showMessageDialog(null,"Dato buscado\n" + datoBuscado);
                           }
Por lo marcado en verde:
Citar
if (datoBuscado.contains(datoAbuscar)) {
                  JOptionPane.showMessageDialog(null,"Dato buscado\n" + datoBuscado);
                           }

Ahora sí, ya sí podríamos encontrar cualquiera de esos datos.  Y ya estamos cumpliendo con lo que pide el ejercicio. Todo resuelto  ;)

 Peeeero..., aún podemos ser más precisos.
Ahora mismo estamos leyendo lineas enteras porque usamos los métodos .hasNextLine() y nextLine()

Usemos este texto:
Citar
rojo azul azul azul
barcelona madrid granada
perro gato marmota

Supongamos que queremos que nuestro programa lanze un aviso cada vez que encuentra el dato que buscamos. Es decir, que si está repetido, nos lance un aviso para cada repetició.
Si buscamos la palabra "azul, ahora mismo nuestro programa se equivocaría, y diría que la palabra "azul" solo está 1 vez.
Porque lo que hace es leer la línea completa, comprueba si contiene la palabra "azul" -->(.contains("azul")), lanza un aviso y pasa a la siguiente linea, ignorando que la palabra "azul" esta repetida más veces en la primera línea.

Para evitar esto, podemos hacer que el Scanner, en lugar de lineas, que lea palabra por palabra con los métodos .hasNext() y next();
Quedaría así:
Citar
try {
          Scanner lector = new Scanner(file);
         while (lector.hasNext()) {
            String datoBuscado = lector.next();
            
            if (datoBuscado.contains(datoAbuscar)) {
                  JOptionPane.showMessageDialog(null,"Encontrado dato\n " + datoBuscado);
                           }
                 while(datoBuscado!=("|"));
                 
               }

Con esto ya debería funcionar, pruébalo y pregunta cualquier duda que puedas tener
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

China

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 24
    • Ver Perfil
Re:Leer y mostar datos de un archivo txt en java estoy utilizando jgrasp
« Respuesta #2 en: 05 de Junio 2018, 15:47 »
Lo que quiero es me lean una línea entera de lo que tengo en el archivo ejemplo en el tengo 12345 - juana-sanchez-ojeda-13-delantero-disponible- femenino|
Le tengo "|" eso para que sepa que ahí terminar la línea completa

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Leer y mostar datos de un archivo txt en java estoy utilizando jgrasp
« Respuesta #3 en: 05 de Junio 2018, 19:51 »
Lo que quiero es me lean una línea entera de lo que tengo en el archivo ejemplo en el tengo 12345 - juana-sanchez-ojeda-13-delantero-disponible- femenino|
Le tengo "|" eso para que sepa que ahí terminar la línea completa

Entonces sí. Lo puedes hacer usando .nextLine() para el objeto Scanner y así vas cogiendo líneas completas.

Y si la búsqueda la haces usando el valor "12345", utiliza el método .startsWith() para identificar la linea que comience por ese valor.

Sobre lo de "|"...
No es necesario, y además no sirve. El Scanner considera que una linea termina cuando se encuentra el símbolo de "retorno de carro" \r o el símbolo de nueva línea \n (son símbolos que no podemos ver y se añaden cuando al escribir un texto pulsamos intro para terminar la linea y empezar una nueva).

Así que el Scanner considera que una linea termina al encontrar el \r, o el \n o bién cuando ha llegado al final del fichero.
No hace falta indicarle cuál es el final de línea de ningún modo.
« Última modificación: 05 de Junio 2018, 19:54 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

China

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 24
    • Ver Perfil
Re:Leer y mostar datos de un archivo txt en java estoy utilizando jgrasp
« Respuesta #4 en: 05 de Junio 2018, 22:28 »
Para poder hacer una modificacion y eliminacion puedo utilizar este codigo?
Estoy utilizando metodos get y set para que me guarde
« Última modificación: 05 de Junio 2018, 22:36 por China »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".