Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Sebasmc2 en 1 Mayo 2014, 18:30 pm



Título: Encontrar un numero dentro de un archivo
Publicado por: Sebasmc2 en 1 Mayo 2014, 18:30 pm
Buenas
Soy un nob con Java y tengo una cuestion con un programilla que no se como resolver.
Mirad, tengo un archivo TXT con números y palabras, separados por un salto de linea cada uno, que lo tengo que leer y cuando encuentre un numero, por ejemplo el 5, tiene que moverse una linea mas, donde encontrara otro numero que le dirá cuantas lineas mas tiene que leer, estas lineas que tiene que leer son palabras que las tendrá que guardar en un array.
Sé como hacer que me lea el archivo entero pero no hay manera de que al llegar al numero que le digo por lo menos se pare. No se si servira de ayuda pero este es mi codigo:
try{
       FileReader f = new FileReader("listaPalabras.txt");
        BufferedReader fichero = new BufferedReader(f);
       
        //Leer la primera línea, guardando en un String
         String texto = fichero.readLine();
         //Repetir mientras no se llegue al final del fichero
         while(texto != null)
          {
           //Hacer lo que sea con la línea leída
            System.out.println(texto);
            //Leer la siguiente línea
            texto = fichero.readLine();
   }

He intentado en el while poner (texto=="5"), pero no me lee nada, si pongo (texto!="5") me lo lee todo y además se queda en un bucle infinito

A ver si alguien me puede ayudar que estoy bastante desesperado..

Gracias!!


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: Chuidiang en 1 Mayo 2014, 18:35 pm
Las cadenas se comparan con equals(), no con ==. Prueba a ver haciendo así la comparación

("5".equals(texto))

Al final de aquí tienes más detalles http://foro.elhacker.net/java/c_es_distinto_de_un_string-t413478.0.html

Se bueno.


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: Sebasmc2 en 1 Mayo 2014, 18:57 pm
Muchas gracias por responder.
Lo he probado - while("5".equals(texto)) - y me hace exactamente lo mismo  :-(


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: gordo23 en 1 Mayo 2014, 19:22 pm
Si lo que tenés que leer es un número yo lo haría así:

int numero = Integer.valueOf(fichero.readLine());

Y con eso la comparación la podés hacer tranquilamente con numero == 5


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: Sebasmc2 en 1 Mayo 2014, 20:04 pm
Hace exactamente lo mismo......
No se a ver si va a ser problema del archivo.
Si a nadie se le ocurre otra cosa importare el archivo a un array y trabajaré sobre el array a ver si así me va mejor

Saludos y gracias


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: gordo23 en 1 Mayo 2014, 21:51 pm
No logro entender lo que querés lograr. ¿Qué tenés en el archivo de texto y que exactamente tiene que hacer el programa?


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: ivancea96 en 1 Mayo 2014, 22:01 pm
Vamos a ver. Si no me equivoco, quieres leer hasta encontrar un número, ¿no?

Si pones while(texto=="5") estás diciendo que lea SOLO si el texto es "5". Tendrías que tener un "5" en la primera linea, y luego un salto de línea.

Quizás lo que debas hacer, es, después de leer una linea del archivo, comprobar si en esta se encuentra el número en cuestión.

Si no es eso lo que buscas, explícamelo mejor jeje


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: Chuidiang en 2 Mayo 2014, 07:30 am
No estaría de más que mostraras el contenido del archivo y el código donde haces esa comparación. En el que muestras sólo lees líneas y no haces nada con ellas.

Se bueno.


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: Sebasmc2 en 2 Mayo 2014, 18:05 pm
Claro no hacia nada con la linea leida... ahora he hecho unos cambios y me va a medias.
A ver si me explico mejor...el programa me pide un numero, este numero es el que tendra que buscar dentro del archivo, puede ser 4, 5 o 6. Cuando haya encontrado este numero tiene que leer la linea siguiente que es la que indicara el numero de lineas que tiene que leer a continuacion.
En estas lineas encontramos las palabras del tamaño que nos indica el numero que nos ha pedido. El programa lo que tendra que hacer con estas lineas leidas es pasar las palabras a un array, pero esto ya es otro tema. Mi problema principal es que me encuentre el numero que le digo y me lea la linea siguiente.

Con los cambios que he hecho, si le pongo un 4 me lo encuentra y me lee la siguiente linea, la imprime por eso entiendo que funciona, pero si le pongo 6 o 5 no me hace nada, se termina el programa.

Este es el codigo entero:

*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ioc.m3.biblioteca;

import java.io.*;

import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author Sebas
 */
public class PruebasDiccionario {
    

public static void main(String[] args) throws IOException {
          
     //Preguntamos al usuario el numero que queremos encontrar en el archivo
     System.out.println("Introduce el tamaño de las palabras :");
            Scanner scanner = new Scanner(System.in);
            String tamaño = scanner.nextLine();
            
     try{
       File f = new File("listaPalabras.txt");
        RandomAccessFile fichero = new RandomAccessFile(f,"r");
        
        //Leer la primera línea, guardando en un String
         String texto = fichero.readLine();
        
         //Repetir mientras no se llegue al final del fichero
            while(texto!=null){
            
              //Comparamos la linea con el numero que le hemos indicado
                if (tamany.equals(fitxer.readLine())){
                
                  System.out.println(fitxer.readLine());

                    }
            //Leer la siguiente línea
              texto = fitxer.readLine();
            }
            
           // Close the file.
           fitxer.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Diccionari.class.getName()).log(Level.SEVERE, null, ex);
        }
       }
        
    
}


**************
Y el contenido del archivo es esto. el primer numero indica el tamaño de las palabras y el segundo el numero de palabras que hay (he borrado muchas por que si no la lista es muy larga)

5
581
ABANS
ABAST
ABRIC
ABRIL
ABSIS
ACERB
ACORD
ACTIU
ACTOR
ACUIT
ACULL
ALTRI
AMANT
AMARG
...
4
281
abat
acer
acne
acre
asma
aspa
assa
asta
atac
atea
ateu
atol
atri
atur
...
6
184
abadia
abatre
abatut
abduir
abecar
abella
abisme
abocar
abocat
aboiar
abolir
abonar
abonat
absent
...



Título: Re: Encontrar un numero dentro de un archivo
Publicado por: gordo23 en 3 Mayo 2014, 04:50 am
No he usado nunca la clase RandomAcessFile, pero, ¿esto no serviría?:

Código
  1. while (texto = fichero.readLine() != null) { //Lee una linea, la asigna a la variable texto y chequea que no sea null
  2.    if(texto.equals(tamanio)) {
  3.        int numeroPalabras = Integer.valueOf(fichero.readLine()); //La siguiente linea al tamanio de la palabra que queriamos encontrar lee un entero de la cantidad de palabras que vamos a leer
  4.        for(int i = 0; i < numeroPalabras; i++) {
  5.            String palabra = fichero.readLine();
  6.            //Aca lo que harías con cada palabra
  7.        }
  8.    }
  9. }
  10.  

PD: No probé el código, así que no se si tiene errores pero es basicamente lo que haría yo. Podrías ajustarlo y probar si te funciona.


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: Chuidiang en 3 Mayo 2014, 08:56 am
Tampoco estaría de más que pusieras el código que realmente tienes. Abres fichero y lo guardas en la variable "fichero", pero lo lees como variable "fixter", por lo que deduzco que ese no es tu codigo real, sino que has hecho copy-paste de trozos para ponerlo aquí, y por lo que se ve, no es fiable. Si encontramos algún error en el código que has puesto, igual no es el mismo que el código que realmente tienes.

Otro fallo que hay es que estás usando fixter.readLine() (sunponiendo que fixter sea fichero) cada poco dentro del bucle, dentro del bucle tienes

Código:
            while(texto!=null){
            
              //Comparamos la linea con el numero que le hemos indicado
                if (tamany.equals(fitxer.readLine())){
                
                  System.out.println(fitxer.readLine());

                    }
            //Leer la siguiente línea
              texto = fitxer.readLine();

No estás haciendo nada con texto que es la primera línea que lees, salvo ver que no es null. El tamañoo lo estás comparando contra una nueva linea que lees (fixter.readLine()) y si esa segunda línea que has leido es del tamaño adecuado, sacas por pantalla una tercera línea que lees de nuevas con System.out.println(fitxer.readLine(). Luego lees la cuarta con texto = fitxer.readLine(); para seguir el bucle y comparar el tamaño de la quinta....

El bucle correcto sería así

Código:
        String texto = fichero.readLine();
        
         //Repetir mientras no se llegue al final del fichero
            while(texto!=null){

            // Haz aquí cosas con texto, que es la línea que has leído, y no hagas ningún readLine().
            
            // lee siguiente linea.
              texto = fitxer.readLine();
            }

Aun así, te faltan más cosas para conseguir lo que quieres, pero vete primero arreglando esto.

Se bueno.


Título: Re: Encontrar un numero dentro de un archivo
Publicado por: Sebasmc2 en 3 Mayo 2014, 15:35 pm
Muchas gracias a todos por responder, sobretodo a Chuidiang ya que con su ultimo post me ha quedado mas claro todo.
Ya me va bien, ahora voy con la otra parte. Si no me funciona volvere a preguntar  :P

Pongo el código a ver si le sirve a alguien

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ioc.m3.biblioteca;

import java.io.*;

import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

import ioc.m3.u5.Eac5;


/**
 *
 * @author Sebas
 */
public class ProvesDiccionari {
   

public static void main(String[] args) throws IOException {
           
     
     System.out.println("Introduce el tamaño de las palabras :");
            Scanner scanner = new Scanner(System.in);
            String tamany = scanner.nextLine();
           
     try{
       File f = new File("C:\\Users\\Sebas\\Documents\\NetBeansProjects\\EAC6\\import\\llistaParaules.txt");
        RandomAccessFile fitxer = new RandomAccessFile(f,"r");
       
        //Leer la primera línea, guardando en un String
         String texto = fitxer.readLine();
       
         //Repetir mientras no se llegue al final del fichero
            while(texto!=null){
             //Comparamos el numero que le indicamos con lo que hay en el fichero
                if (tamany.equals(texto)){
                    String texto1 = fitxer.readLine();
                 System.out.println(texto1);
                }
            //Leer la siguiente línea
            texto = fitxer.readLine();
            }
           
           // Close the file.
           fitxer.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Diccionari.class.getName()).log(Level.SEVERE, null, ex);
        }
       }