Autor Tema: Contar el número de palabras, caracteres y líneas de archivo .txt en Java editor  (Leído 2642 veces)

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Buen día a todos, sé que este es un clásico que algunos ya han solicitado pero en mi caso estaba trabajando con el siguiente código:

Código: [Seleccionar]
package JavaArchivo;//esta es la clase principal

import java.io.File;
import java.util.LinkedList;

public class principal {

public static void main(String[] args) {
int lineas=0, palabras=0, caracteres=0;

LinkedList<File> listFicheros = new LinkedList<>();

for(int i = 1; i <= 5; i++) {
listFicheros.add(new File("C:\\Users\\user\\Desktop\\ArchivoJava.txt"));
}
for(int i = 0; i < listFicheros.size(); i++) {
Archivo archivo = new Archivo(listFicheros.get(i));
lineas += archivo.getLineas();
palabras += archivo.getPalabras();
caracteres += archivo.getCaracteres();
       
    }
System.out.println("Lineas: "+lineas+"\nPalabras: "+palabras+"\nCaracteres: "+caracteres);
    }

}

Y esta es la clase que definí como Archivo
Código: [Seleccionar]
package JavaArchivo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Archivo {

    private File fichero;
    private String contenido;

    public Archivo() {

    }

    public Archivo(File fichero) {
        this.fichero = fichero;
        this.contenido = "";
        leerContenido();
    }

    public void leerContenido() {
        String linea = null;
        FileReader f = null;
        BufferedReader b = null;
        StringBuilder aux = new StringBuilder();
        try {
            f = new FileReader(this.fichero);
            b = new BufferedReader(f);
            try {

                while ((linea = b.readLine()) != null) {
                    aux.append(linea);
                    aux.append("\n");
                }
            } catch (IOException ex) {
                Logger.getLogger(principal.class.getName()).log(Level.SEVERE, null, ex);
            }

        } catch (FileNotFoundException ex) {
            Logger.getLogger(principal.class.getName()).log(Level.SEVERE, null, ex);
        }
        this.contenido = aux.toString();
    }

    public String getContenido() {
        return contenido;
    }

    public int getLineas() {
        if (this.contenido.equals("")) {
            return 0;
        } else {
            return this.contenido.split("\n").length;
        }
    }

    public int getPalabras() {
        if (this.contenido.equals("")) {
            return 0;
        } else {
            return this.contenido.replace("\n", "").split("\\s+").length;
        }
    }

    public int getCaracteres() {

        return this.contenido.replaceAll("\\s+", "").replace("\n", "").length();
    }

}

En sí el código no me marca error en la sintaxis o algo por el estilo, lo hace al ejecutarse
Por ejemplo si tengo un Archivo.txt que en su contenido tiene:
Citar
Hola
Buenas Tardes

Me dice que son 10 Líneas, 10 palabras y 80 caracteres...  :-\
« Última modificación: 11 de Enero 2022, 20:06 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Mmmhh.. la clase Archivo parece no estar mal del todo. Lo de contar palabras me temo que fallará cuando una palabra ocupe una línea completa, porque no tendrá ningún espacio en blanco ni delante ni detrás, así que ese código no la contará como palabra.

Pero lo que veo realmente raro es esto en la clase principal

Código: [Seleccionar]
for(int i = 1; i <= 5; i++) {
listFicheros.add(new File("C:\\Users\\user\\Desktop\\ArchivoJava.txt"));
}

Tú trabajas con un archivo, pero ese mismo archivo lo añades 5 veces.
Y luego haces los cálculos, con esas 5 copias del mismo archivo.

Por eso, aunque tengas solo 2 líneas en tu archivo, te dice que tienes 10 (2 x 5)
Aunque solo tienes 16 caracteres, te dice que tienes 80(16 x 5)

Y aunque tienes 3 palabras, solo te cuenta 2 (la primera que ocupa toda la línea la ignora) pero te dice que son 10 (2x5)

Resumiendo, no necesitas ese LinkedList para nada, a no ser que quieras que el programa te sirva para trabajar con varios archivos..., pero entonces procura que sean distintos, y no 5 copias del mismo.

Y tienes que revisar el método de contar palabras, para que te incluya también palabras que ocupen una línea completa.
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

Sergio Perez

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
En efecto estimado Kabuto, ya revise todo meticulosamente y redefiní la cuestión de los espacios para los caracteres y en el for estaba mal trabajar con 5 y quedó así:

Código: [Seleccionar]
for(int i = 1; i <= 1; i++) {
listFicheros.add(new File("C:\\Users\\user\\Desktop\\ArchivoJava.txt"));
}
for(int i = 0; i < listFicheros.size(); i++) {
Archivo archivo = new Archivo(listFicheros.get(i));
lineas += archivo.getLineas();
palabras += archivo.getPalabras();
caracteres += archivo.getCaracteres();
       
    }
System.out.println("Lineas: "+lineas+"\nPalabras: "+palabras+"\nCaracteres: "+caracteres+"\nArchivos: "+listFicheros.size());
    }


Mil gracias por la orientación!!!  ;D

 

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