Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Sergio Perez en 16 de Abril 2021, 23:37

Título: Contar el número de palabras, caracteres y líneas de un archivo .txt en Java
Publicado por: Sergio Perez en 16 de Abril 2021, 23:37
Buen día a todos, se 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...  :-\
Título: Re: Contar el número de palabras, caracteres y líneas de un archivo .txt en Java
Publicado por: Kabuto en 18 de Abril 2021, 01:53
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.
Título: Re: Contar el número de palabras, caracteres y líneas de un archivo .txt en Java
Publicado por: Sergio Perez en 18 de Abril 2021, 02:09
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