Leer archivo de texto
Que tal, soy nuevo en el foro y busco un poco de ayuda para realizar un programa que me han dejado en la escuela, el programa consiste de lo siguiente:
1.Haga un programa para llevar la contabilidad del número de palabras que hay en un archivo de texto (creado con el NotePad) y para cada palabra registrar el número de ocurrencias. Ejemplo:
La casa de Lola es grande, pero la casa grande de Lalo es mejor. Javier es un hombre grande y su casa es grande también. Lola no es grande; Lalo es joven; Javier es hombre maduro.
Número total de palabras:
Listado de palabra encontradas con su número de ocurrencias:
No quiero que me hagan el programa, por que ese es mi trabajo y en realidad lo que quiero es aprender, solo quisiera que me guiaran de como hacerlo con ideas y ya yo lo voy diseñando. Tengo los conocimientos basicos sobre Java apenas voy empezando en este tema. Se que de las clase que necesito usar para crear mi programa. La clase File para leer archivos de texto, la clase StringTokenizer con la funcion Split para dividir palabras. Bueno agradecere sus respuestas. Y pondre mi codigo cuando lo termine.
- Inicie sesión o regístrese para enviar comentarios
Ok empieza por leer esto
Muy bien, empieza por leer esto Del problema al código . Después de haberlo hecho, vienes y expones tus dudas. Y te ayudare en lo que pueda.
Saludos.
Checa este
Mira mi chavo hice algo parecido a lo que tu quieres, el programa no esta comentado, no hay ninguna explicación, se trata de que veas como lo hice y a partir de allí te bases y/o preguntes. Correlo, muevele, cambiale. Básicamente lo que ocupabas para realizar tu trabajo es algo que ya esta muy comentado en los blogs y en los foros de programación en Java.
Una forma de programar que te puede ser útil es que te hagas preguntas sobre las cosas que no entiendes, eso lo hago yo y no solamente para programar, lo uso en todas las materias jeje.
Por ejemplo:
¿Como abrir un archivo?
¿Como cargar el contenido del archivo a una variable?
¿Como contar las palabras?
¿Como buscar las palabras?
A partir de esas simples preguntas puedes ir buscando información sobre su solución. Cuando encuentres las respuestas quedara solamente que las unas todas en tu programa y listo! :D
Pero hacerte las preguntas no te sirven si no has entendido el problema, para eso, esta el link que te deje en el primer post.
Tu salvador es www.google.com y tu mejor amiga es la API de Java http://download.oracle.com/javase/6/docs/api/
Bueno por ultimo te dejo un link donde esta el código de mi aplicación para que lo pruebes.
http://pastebin.com/raw.php?i=dvtxQudh
Saludos.
StringTokenizer
En Java puedes usar el StringTokenizer.
Lo primero que debes hacer es leer el archivo, ya sea completo o línea por línea, como texto. Para eso puedes usar un FileReader envuelto en un BufferedReader. Ya que tienes una línea de texto, usas el StringTokenizer para separar las palabras. Necesitas también un mapa mutable (HashMap es buena opción en este caso), para poner las palabras que te vas encontrando por primera vez, o incrementar la cuenta de las palabras que ya te habías encontrado.
Scala
Sé que no sirve de nada, pero me pareció un ejercicio interesante para resolver en Scala.
Considerando que tengas ya una cadena que quieres procesar, con dos funciones la armas:
def words(s:String)=s.split("[,;\\. ]").filter(_.length>0) toList
//Y esta cuenta las ocurrencias de cada palabra en la lista
def contar(words:List[String])=words flatMap { w=> Map(w->words.count(_.toLowerCase==w.toLowerCase)) } toSet
SI ejecuto
contar(words("La casa de Lola es grande, pero la casa grande de Lalo es mejor. Javier es un hombre grande y su casa es grande también. Lola no es grande; Lalo es joven; Javier es hombre maduro"))
obtengo esto:Para el total de palabras en la cadena, simplemente hay que separar las dos llamadas a las funciones; guardar el resultado de
words
en una variable, y como eso es una lista, le pidessize
y eso te da el total de palabras. Le pasas la lista a la funcióncontar
y te da el conjunto de palabras sin repetir, cada una con su número de ocurrencias en la cadena (bueno en la lista realmente).Gracias
Gracias por la ayuda, Jose Manuel probe tu programa y quedo muy bien, le etiendo a la mayoria del codigo, aunque aun no veo lo de graficos en Java y sobre la clase JOptionPane no me piden implementarla. Aunque vio algo de ella en la pagina de la API de Java y si ahorra mucho codigo. A mi me piden mas que implemente la clase File. Y aun no puedo usar la parte grafica. Pero gracias por su ayuda, si me sirve de mucho para darme mas ideas de como hacer mi programa..
Pues de nada, para eso es la
Pues de nada, para eso es la comunidad. Pero yo también soy un novato en esto. La mejor respuesta a tu petición es la de ezamudio.
La forma en la que el lo propone es la solución a tu trabajo.
Por lo de los
JOptionPane
no te preocupes, has de cuenta que son losSystem.out.print(" ");
Si tienes dudas en algo pregunta y te ayudo en lo que pueda.
Acuérdate que dijiste que ibas a postear tu código al final :D
Saludos.
Ayuda
Bueno ya trate de hacer mi programa pero aun no logro que me diga el numero de cada palabra, solamente que me da el total de las palabras de archivo de texto y me despliega todas las palabras en forma de un arreglo pero no logro hacer como me de la ocurrencia de cada palabra en el archivo de texto. Les dejo el link para que revisen mi codigo y si me pueden dar un poco de ayuda o algun consejo de como hacerlo. http://pastebin.com/raw.php?i=AQT2tz23
Paso a paso
Conviene siempre que al resolver un problema revises tus conocimientos, revises también lo que se desea resolver y por supuesto revises las facilidades que las bibliotecas del lenguaje te brinda para resolver ese problema.
En tu tarea hay varias cosas que solucionar:
Para cada una de las tareas que tienes que hacer, revisas lo que Java te ofrece para eso. Por supuesto que habrá varias formas de hacerlo. El código que aparece a continuación es una solución posible, pero no la única.
Diseñamos una clase
CuentaPalabras
con el único objetivo que contenga una función para crear el conjunto de palabras y una estructura que contenga la cantidad de veces que las palabras de ese conjunto se repiten en el archivo.Tanto el conjunto como la frecuencia de repetición de las palabras, se puede lograr con un mapa. Debes saber que un mapa es una estructura de datos compuesta por tuplas de dos elementos. El primer elemento se conoce como llave y el segundo elemento como valor. Como esa estructura se usa para representar en el código el concepto de función, es necesario que las llaves de las tuplas sean diferentes. Las llaves son parte del dominio de la función y los valores de esas tuplas el codominio.
Necesitas por supuesto leer el archivo y dividirlo en palabras. Hay varias soluciones para eso. En el código se está usando la clase
java.util.Scanner
para procesar ese archivo y obtener las palabras. Para eso, es necesario conocer cuales son los delimitadores que ese archivo está usando como posibles separadores de las palabras que contiene.Con esos delimitadores, creamos un patrón representado por una expresión regular, y le decimos al scanner, que utilice esa expresión regular para reconocer los tokens (en este caso las palabras) que contiene el flujo (el archivo) que está procesando.
Cada palabra que te devuelve el scanner, la vas a usar como llave para el mapa. Preguntas entonces si esa llave ya está en el mapa. El mapa devuelve
null
si la llave no se encuentra. En ese caso la insertas, e introduces el valor 1 en el valor de esa tupla. Si la llave ya está en el mapa, entonces incrementas en 1 la tupla correspondiente. Ese valor te da la cantidad de veces que la palabra aparece en el texto.Para obtener el conjunto de palabras, le pides entonces al mapa el conjunto de llaves. La frecuencia de palabras la tienes en el mapa.
La clase
CuentaPalabras
:import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
public class CuentaPalabras {
public static Map<String, Integer> crearPalabras(InputStream in, Map<String, Integer> mapa) {
Pattern patron = Pattern.compile("[.;\\s,?¿!]");
Scanner scaner = new Scanner(in);
scaner.useDelimiter(patron);
String palabra;
while (scaner.hasNext()) {
palabra = scaner.next();
Integer frecuencia = mapa.get(palabra);
if (palabra.length() != 0) {
mapa.put(palabra.toLowerCase(), (frecuencia == null) ? 1 : frecuencia + 1);
}
}
scaner.close();
return mapa;
}
}
Y ahora, escribes un programa que lee de la línea de comandos el nombre del archivo de entrada y usa el método
crearPalabras
de la claseCuentaPalabras
.import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class Entradasalida {
public static void main(String[] args) {
Map<String, Integer> mapa = new HashMap<String, Integer>();
try {
System.out.print("Archivo de entrada= ");
BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));
String archivo =bin.readLine();
InputStream in = new FileInputStream(archivo);
mapa =CuentaPalabras.crearPalabras(in,mapa);
System.out.println("Palabras "+mapa.keySet());
System.out.println("Mapa = "+mapa);
}
catch(Exception e){
//Procesas aquí cualquier excepción de entrada salida
}
}
}
Excelente
Simplemente genial. No puedo decir otra cosa :D
Yo quiero explicar igual que usted.
Algo similar
bferro gracias por tu explicacion y ayuda en el ejemplo que pusiste me fue de gran ayuda. Recien comienzo con programacion y aun me falta mucho por aprender, es muy unteresantel la interface map que utilizas en tu codigo, me puse a leer un poco sobre ella y encontre un ejemplo en el libro "Como programar en Java" de Deitel&Deitel, similar al que me pones, aqui les dejo el codigo como un pequeño aporte.
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;
import java.util.Scanner;
public class ConteoTipoPalabras {
private Map<String, Integer> mapa;
private Scanner scanner;
public ConteoTipoPalabras() {
mapa = new HashMap<String, Integer>();
scanner = new Scanner(System.in);
crearMap();
mostrarMap();
}
private void crearMap() {
System.out.println("Escriba una cadena:");
String entrada = scanner.nextLine();
StringTokenizer tokenizer = new StringTokenizer(entrada);
while ( tokenizer.hasMoreTokens()) {
String palabra = tokenizer.nextToken().toLowerCase();
if (mapa.containsKey(palabra)) {
int cuenta = mapa.get(palabra);
mapa.put(palabra, cuenta + 1);
}
else
mapa.put(palabra, 1);
}
}
private void mostrarMap() {
Set<String> claves = mapa.keySet();
TreeSet<String> clavesOrdenadas = new TreeSet<String>(claves);
System.out.println("El mapa contiene: \nClave\t\tValor");
for (String clave : clavesOrdenadas)
System.out.printf("%-10s%10s\n", clave, mapa.get(clave));
System.out.printf("\nsize:%d\nisEmpty:%b\n", mapa.size(), mapa.isEmpty());
}
public static void main (String args[] ) {
new ConteoTipoPalabras();
}
}
dos son mejor que uno
ola a todos,,yo soyprinsipiante en programación,,,
quien puede ayudarme a diseñarun programa que pueda leer un archivo y encuentre las palabras en el archivo, las separe y me diga x ejemplo
HOLA! MUNDO
H O L A ! M U N D O
PALABRAS ENCONTRADAS
9..ALGO ASI XFAVOR ME PUEDE ALGUIEN AYUDAR?
YOU
podeis ayudarme a diseñar algo parecido.....
solo tengo la idea....pero casi no se d programacion
de un programa que lea los archivos
la idea es esta........
DONDE QUIERA QUE VAYAS VOY....REGRESA PRONTO......ESTADO OCUPADO..
MIS VECINOS NO DEJAN DORMIR
OK...AL INICIO QUE ME LEA LOS CARACTERES
ME SEPARE LAS PALABRAS Y QUE AL FINAL ME INDIQUE
TANTAS PALABRAS ENCONTRADAS.