Autor Tema: Java contador palabras de archivo txt BufferedReader FileReader Scanner contar  (Leído 9488 veces)

fran780

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Buenas tardes, soy nuevo en esto y necesito crear un programa en java que me cuente el numero de palabras que tiene un archivo especifico, mediante flujo de datos stream,y no consigo hacerlo, si me podeis ayudar....? gracias.
« Última modificación: 18 de Octubre 2020, 19:43 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:contador palabras de un archivo
« Respuesta #1 en: 26 de Junio 2020, 11:37 »
Empieza tú un código.
Comienza reduciendo lo que te piden a algo más sencillo.
Haz simplemente un programa que lea un archivo de texto y muestre su contenido en pantalla.

Si no lo consigues, muestra aquí tu código, dinos donde te atascas y te ayudamos a continuarlo.

Cuando eso funcione, ya pensaremos en lo de contar palabras.
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

fran780

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:contador palabras de un archivo
« Respuesta #2 en: 26 de Junio 2020, 21:04 »
Buenas tardes, os dejo mi codigo:

public class fichero {
   
   public static void main(String[] args) {
      
      try {
         FileReader fr = new FileReader("C:/prova/fichero.txt");
         
         int c=fr.read();
         
         while(c!=-1) {
            
            c=fr.read();
            char letra=(char)c;
            
            System.out.print(letra);
            
         }
      } catch (IOException e) {
         // TODO Auto-generated catch block
         System.out.println("no se ha encontrado el archivo");
      }
   }

me muestra lo que tengo en el archivo "fichero.txt" por pantalla y a partir de aqui no se como contar las palabras.
Otra cosa que me pasa es que me muestra todas las letras excepto la primera, si me podeis ayudar???, gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:contador palabras de un archivo
« Respuesta #3 en: 27 de Junio 2020, 01:35 »
No te muestra la primera porque haces una lectura antes de entrar en el while que no se está mostrando en pantalla.

Usar FileReader puede ser tedioso en este caso, porque va carácter a carácter.
Se podría usar junto con BufferedReader, esta clase se construye a partir de un FileReader y te permite leer líneas enteras devueltas en la clase String.
Por cada línea String obtenida, se podría contar las palabras usando una expresión regular o bien dividiendo el String usando su método split().
Si a este método le pasamos como argumento un espacio en blanco -> split(" "), dividirá cada String en "trozos" haciendo "cortes" allá donde encuentre un espacio en blanco, y dichos trozos los retorna en un array de String[].
Estos trozos, serían las palabras, así que bastaría con preguntar cuándo mide el array retornado, sumarlo en una variable acumuladora y repetir el mismo proceso con la siguiente línea.


Sin embargo, puesto que básicamente solo queremos contar palabras, todo esto se puede simplificar mucho más si usamos la clase Scanner.
Esta clase solemos usarla para recibir datos por teclado por parte del usuario. Sin embargo también sirve para "recibir datos" por otras vías, por ejemplo, de un archivo de texto plano. (mediante un objeto File)

Además cuenta con dos métodos muy útiles para este ejercicio.
Con el método next() nos devuelve directamente una palabra, es decir, lee caracteres hasta encontrar un espacio en blanco. Así que nos va a proporcionar palabras, que podremos mostrar y contar.

Y con el método  hasNext(), nos dice si aún queda alguna palabra o no por recibir, así podremos usarlo como condición de bucle para que repetir el proceso de leer palabras y contarlas, mientas que hasNext() devuelva valor true

Así que el código para hacerlo, puede ser tan sencillo como este:

Código: [Seleccionar]
public class ContarPalabras {

public static void main(String[] args) {

Scanner lector;
int contador = 0;
try {
lector = new Scanner(new File("D:/poema.txt"));

while(lector.hasNext()) {
System.out.println("Palabra: " + lector.next()); //Mostramos palabra leída
contador++; //La contamos
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}

System.out.println("\nTotal palabras contadas: " + contador);
}

}

El uso de try catch es obligatorio.

Bien, mi archivo poema.txt que uso en el código tiene este texto:
Citar
Caminante, son tus huellas
el camino y nada más;
Caminante, no hay camino,
se hace camino al andar.
Al andar se hace el camino,
y al volver la vista atrás
se ve la senda que nunca
se ha de volver a pisar.
Caminante no hay camino
sino estelas en la mar.

Y si ejecuto el programa, obtengo este resultado en pantalla:
Citar
Palabra: Caminante,
Palabra: son
Palabra: tus
Palabra: huellas
Palabra: el
Palabra: camino
Palabra: y
Palabra: nada
Palabra: más;
Palabra: Caminante,
Palabra: no
Palabra: hay
Palabra: camino,
Palabra: se
Palabra: hace
Palabra: camino
Palabra: al
Palabra: andar.
Palabra: Al
Palabra: andar
Palabra: se
Palabra: hace
Palabra: el
Palabra: camino,
Palabra: y
Palabra: al
Palabra: volver
Palabra: la
Palabra: vista
Palabra: atrás
Palabra: se
Palabra: ve
Palabra: la
Palabra: senda
Palabra: que
Palabra: nunca
Palabra: se
Palabra: ha
Palabra: de
Palabra: volver
Palabra: a
Palabra: pisar.
Palabra: Caminante
Palabra: no
Palabra: hay
Palabra: camino
Palabra: sino
Palabra: estelas
Palabra: en
Palabra: la
Palabra: mar.

Total palabras contadas: 51

Es un código sencillo y efectivo.
No contempla posibles casos muy concretos, como que un texto tenga símbolos separados de las palabras.
Si en mi texto de ejemplo separo los puntos y comas de las palabras que les preceden (lo cuál no es ortográficamente correcto), entonces Scanner también los considerará como palabras y dará un resultado erróneo.

Citar
Palabra: Caminante
Palabra: ,
Palabra: son
Palabra: tus
Palabra: huellas
Palabra: el
Palabra: camino
Palabra: y
Palabra: nada
Palabra: más
Palabra: ;
Palabra: Caminante
Palabra: ,
Palabra: no
Palabra: hay
Palabra: camino
Palabra: ,
Palabra: se
Palabra: hace
Palabra: camino
Palabra: al
Palabra: andar
Palabra: .
Palabra: Al
Palabra: andar
Palabra: se
Palabra: hace
Palabra: el
Palabra: camino
Palabra: ,
Palabra: y
Palabra: al
Palabra: volver
Palabra: la
Palabra: vista
Palabra: atrás
Palabra: se
Palabra: ve
Palabra: la
Palabra: senda
Palabra: que
Palabra: nunca
Palabra: se
Palabra: ha
Palabra: de
Palabra: volver
Palabra: a
Palabra: pisar
Palabra: .
Palabra: Caminante
Palabra: no
Palabra: hay
Palabra: camino
Palabra: sino
Palabra: estelas
Palabra: en
Palabra: la
Palabra: mar
Palabra: .

Total palabras contadas: 59

Así que se podría aumentar código para descartar todos los posibles símbolos como palabras...
Pero bueno, es algo opcional, se supone que nuestro programa va a recibir un texto correcto, y no una chapuza xD.

Si algo no te ha quedado claro, no dudes en preguntar.
Si por algún motivo no puedes usar la clase Scanner, porque se supone que has de usar obligatoriamente BufferedReader y/o FileReader, dilo y buscamos otra solución
Lo de usar split() funcionaría con BufferedReader.
Si tuvieramos que limitarnos a usar solo FileReader, pues casi mejor pegarnos un tiro  :o , pero bueno, supongo que también se podría desarrollar una solución.

Un saludo.
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

fran780

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:contador palabras de un archivo
« Respuesta #4 en: 27 de Junio 2020, 08:27 »
Buenos dias Kabuto!! Gracias por tu ayuda!!

Perdon por mis errores es que acabo de empezar en esto.... :P

Ya he solucionado lo de la primera letra.
Como he visto en tu ejemplo con scanner queda bastante simplificado, pero lo tengo que hacer con  BufferedReader..........

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:contador palabras de un archivo
« Respuesta #5 en: 27 de Junio 2020, 12:21 »
Como he visto en tu ejemplo con scanner queda bastante simplificado, pero lo tengo que hacer con  BufferedReader..........

Lo sospechaba.
Pero bueno, tampoco es mayor complicación.
Como dije, en este caso podemos leer líneas completas.
Cada línea la troceamos con split y obtenemos un array con cada palabra de dicha línea.
Acumulamos la longitud de este array y repetimos el proceso.

Dejo el código con Scanner comentado y añado el que usa BuffererReader

Código: [Seleccionar]
public class ContarPalabras {

public static void main(String[] args) {
/* Ejemplo con Scanner
Scanner lector;
int contador = 0;
try {
lector = new Scanner(new File("D:/poema.txt"));

while(lector.hasNext()) {
System.out.println("Palabra: " + lector.next());
contador++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}


System.out.println("\nTotal palabras contadas: " + contador);*/

//Ejemplo con BufferedReader
int contador = 0;
try {
BufferedReader br = new BufferedReader(new FileReader("D:/poema.txt"));
System.out.println("TEXTO LEIDO");
System.out.println("----- -----\n");

String linea = br.readLine();
while (linea != null) {
System.out.println(linea);
//Troceamos línea cortando donde haya espacios en blanco
String[] palabras = linea.split(" ");
//Acumulamos las palabras(trozos) obtenidos
contador += palabras.length;
//Leemos siguiente línea
linea = br.readLine();
}

br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

System.out.println("\nPalabras contadas: " + contador);

}

}

En pantalla saldría este resultado.
Citar
TEXTO LEIDO
----- -----

Caminante, son tus huellas
el camino y nada más;
Caminante, no hay camino,
se hace camino al andar.
Al andar se hace el camino,
y al volver la vista atrás
se ve la senda que nunca
se ha de volver a pisar.
Caminante no hay camino
sino estelas en la mar.

Palabras contadas: 51
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

fran780

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re:contador palabras de un archivo
« Respuesta #6 en: 28 de Junio 2020, 10:26 »
Gracias Kabuto!! por tu ayuda!! ;) ;)

 

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".