Autor Tema: BufferedReader Java leer datos fichero FileReader ejemplo código extraer campos  (Leído 683 veces)

juanpepe

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Partiendo del fichero Restaurantes.txt de ejemplo, crear un programa de Java que
muestre los datos de todos aquellos restaurantes cuyo código postal empiece por 6.

Contenido del fichero restaurante.txt

Código: [Seleccionar]
Restaurant,Address,City,State,Zipcode
Vietnam Restaurant,1615 Commerce Parkway,Bloomington,IL,61704
Chops and Ribs,71 S. Wacker Drive Chicago,Chicago,IL,60606
Molinarinari,"1701 River Drive, Suite 306",Moline,IL,61265
Siam Cusine,"3201 W White Oaks Drive, Suite 204",Springfield,IL,62704
Mary's Diner,"4916 S Technopolis Drive, Building 2",Sioux Falls,SD,57106
Bistro Bob,625 32nd Avenue SW,Cedar Rapids,IA,52404
Wiener House,"400 Locust Street, Suite 420 4th Floor",Des Moines,IA,50309
Irifune Place,"Federal Trust Building, 134 South 13th Street, 10th Floor, Suite 1000",Lincoln,NE,68508
Estradanas,"1111 N 102nd Court, Suite 231",Omaha,NE,68114
Fargo,"3310 Fiectner Drive, Suite 108",Fargo,ND,58103
Fangs,650 Third Avenue South,Minneapolis,MN,55402
China Palace,3605 Hwy 52 North,Rochester,MN,55901
Big Daddy Barbeque,"1005 Ikon Drive, Suite G,",Jefferson City,MO,65109
Wolfs,"3315 E. Ridgeview Street, Suite 4000",Springfield,MO,65804
A Cut Above,30501 Agoura Road,Agoura Hills,CA,91301
Ranch House,650 Harry Road,San Jose,CA,95120
Burgers and Fries,5100 California Avenue,Bakersfield,CA,93309
Hofbrau Deluxe,600 Anton Blvd,Costa Mesa,CA,92626
Jean's Place,100 N. Sepulveda Blvd,El Segundo,CA,90245
Nattos,1001 E. Hillsdale Blvd,Foster City,CA,94404
« Última modificación: 17 de Abril 2021, 20:34 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: ficheros java
« Respuesta #1 en: 19 de Enero 2021, 00:00 »
Hola.
¿En qué tienes dificultades?
No podemos ayudarte si no nos dices que necesitas saber.

Comienza tú un código y cuando te atasques te ayudamos a completarlo.

Intenta hacerlo paso a paso, no pensando en cómo solucionar el TODO, si no buscando objetivos menores.
Si te han pedido este ejercicio, es que como mínimo te han explicado como leer ficheros de texto.
Pues comienza haciendo un programa que lea ese fichero de texto y muestre sus líneas en pantalla.

Cuando tengas eso, modifícalo para que en lugar de mostrar las líneas, separes los datos que contiene cada línea delimitados por las comas.
La clase String ofrece un método llamado split() que trocea una cadena de texto "cortando" donde encuentre el carácter que tu le indiques y te retorna los "trozos" en un array de String.
Así que puedes hacer algo como:
Código: [Seleccionar]
String[] datos = linea.split(",");Así cada línea leída, puedes "trocearla" y consultar esos datos por separado.
Inténtalo y haz que solo se muestre el código postal de cada línea.

Cuando tengas eso, haz que solo se muestren los códigos postales que empiecen por 6.

Y teniendo eso, ya solo es modificarlo un poco para que muestre todos los datos, de las líneas cuyo código postal comience por 6.


Insisto, inténtalo tú. Llega hasta donde puedas, y a partir de ahí te ayudamos.
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

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 725
    • Ver Perfil
Re: ficheros java
« Respuesta #2 en: 23 de Enero 2021, 00:06 »
A ver, para que no caiga esto en el olvido y sirva también de ayuda para futuros visitantes.

Resolvámoslo paso a paso.

Lo primero es conseguir leer el fichero y mostrar sus líneas.
Para esto podemos usar la clase Scanner o la clase BufferedReader.
Yo prefiero esta última.
Para crear un BufferedReader, necesitamos pasarle por constructor un objeto FileReader, quién a su vez necesita un objeto File cuya ruta apunte al fichero que queremos leer. También podemos pasarle directamente un String con esa ruta.

Una vez tenemos el BufferedReader, con el método newLine() le pedimos que nos lea la primera línea y la guardamos en un String
Y cada vez que invoquemos este método, nos devolverá la línea siguiente.

Así que para leer todas las líneas, usamos un bucle que se repetirá mientras que el String que nos devuelva el método newLine(), sea distinto de null, lo cuál significa que ya no quedan líneas por leer.

Cada línea obtenida, la mostramos en pantalla.

Importante que para este proceso, el compilador Java nos OBLIGA a usar try catch para capturar posibles excepciones como que el fichero que queremos leer no existe.
O que tal vez sí existe, pero no se puede leer porque está dañado o hay restricciones de acceso por permisos de usuario.
Java considera que trabajar con ficheros de datos es un tema sensible y no permite dejar sin controlar excepciones que pudieran originar pérdida de datos.

Código: [Seleccionar]
public class LeerFichero {

public static void main(String[] args) {
//Ruta donde encontrar el fichero de texto
String rutaTXT = "D:\\Programacion\\FicherosTXT\\restaurante.txt";

try {
//Configuramos lector de ficheros
BufferedReader lector = new BufferedReader(new FileReader(rutaTXT));
//Leemos línea
String linea = lector.readLine();
//Mientras la linea sea distinto de null, es decir, hay líneas para leer
while (linea != null) {
//Mostramos línea en pantalla
System.out.println(linea);
//Leemos siguiente línea, si no es null, se repetirá el bucle
linea = lector.readLine();
}
//Lectura terminada, cerramos lector
lector.close();
} catch (FileNotFoundException e) {
System.out.println("No se encuentra fichero: " + rutaTXT);
} catch (IOException e) {
System.out.println("No se puede acceder a " + rutaTXT);
}

}
}

Con este simple código, en pantalla podremos ver todas las líneas del fichero:
Citar
Restaurant,Address,City,State,Zipcode
Vietnam Restaurant,1615 Commerce Parkway,Bloomington,IL,61704
Chops and Ribs,71 S. Wacker Drive Chicago,Chicago,IL,60606
Molinarinari,"1701 River Drive, Suite 306",Moline,IL,61265
Siam Cusine,"3201 W White Oaks Drive, Suite 204",Springfield,IL,62704
Mary's Diner,"4916 S Technopolis Drive, Building 2",Sioux Falls,SD,57106
Bistro Bob,625 32nd Avenue SW,Cedar Rapids,IA,52404
Wiener House,"400 Locust Street, Suite 420 4th Floor",Des Moines,IA,50309
Irifune Place,"Federal Trust Building, 134 South 13th Street, 10th Floor, Suite 1000",Lincoln,NE,68508
Estradanas,"1111 N 102nd Court, Suite 231",Omaha,NE,68114
Fargo,"3310 Fiectner Drive, Suite 108",Fargo,ND,58103
Fangs,650 Third Avenue South,Minneapolis,MN,55402
China Palace,3605 Hwy 52 North,Rochester,MN,55901
Big Daddy Barbeque,"1005 Ikon Drive, Suite G,",Jefferson City,MO,65109
Wolfs,"3315 E. Ridgeview Street, Suite 4000",Springfield,MO,65804
A Cut Above,30501 Agoura Road,Agoura Hills,CA,91301
Ranch House,650 Harry Road,San Jose,CA,95120
Burgers and Fries,5100 California Avenue,Bakersfield,CA,93309
Hofbrau Deluxe,600 Anton Blvd,Costa Mesa,CA,92626
Jean's Place,100 N. Sepulveda Blvd,El Segundo,CA,90245
Nattos,1001 E. Hillsdale Blvd,Foster City,CA,94404


Bien.
Vemos que cada línea contiene 5 datos (restaurante, dirección, ciudad, estado, código postal).
Estos datos están separados unos de otros mediante "comas", así que podemos obtener esos datos por separado "cortando" el String allá donde exista una coma.

La clase String ofrece el método split() que nos ayuda a hacer esto y nos retorna los "trocitos" (los datos) separados, pero agrupados en un array.

Código: [Seleccionar]
public class LeerFichero {

public static void main(String[] args) {
//Ruta donde encontrar el fichero de texto
String rutaTXT = "D:\\Programacion\\FicherosTXT\\restaurante.txt";

try {
//Configuramos lector de ficheros
BufferedReader lector = new BufferedReader(new FileReader(rutaTXT));
//Leemos línea
String linea = lector.readLine();
//Mientras la linea sea distinto de null, es decir, hay líneas para leer
while (linea != null) {
//Separamos los datos en un array
String[] datos = linea.split(",");
//Mostramos el array de datos para comprobar su correcta separacion
System.out.println(Arrays.toString(datos));
//Leemos siguiente línea, si no es null, se repetirá el bucle
linea = lector.readLine();
}
//Lectura terminada, cerramos lector
lector.close();
} catch (FileNotFoundException e) {
System.out.println("No se encuentra fichero: " + rutaTXT);
} catch (IOException e) {
System.out.println("No se puede acceder a " + rutaTXT);
}

}
}

Si mostramos en pantalla el contenido de los arrays que split nos va proporcionando, veremos que tenemos los mismos datos que veíamos en las líneas, pero esta vez contenidos en arrays y como elementos separados.
Citar
[Restaurant, Address, City, State, Zipcode]
[Vietnam Restaurant, 1615 Commerce Parkway, Bloomington, IL, 61704]
[Chops and Ribs, 71 S. Wacker Drive Chicago, Chicago, IL, 60606]
[Molinarinari, "1701 River Drive,  Suite 306", Moline, IL, 61265]
[Siam Cusine, "3201 W White Oaks Drive,  Suite 204", Springfield, IL, 62704]
[Mary's Diner, "4916 S Technopolis Drive,  Building 2", Sioux Falls, SD, 57106]
[Bistro Bob, 625 32nd Avenue SW, Cedar Rapids, IA, 52404]
[Wiener House, "400 Locust Street,  Suite 420 4th Floor", Des Moines, IA, 50309]
[Irifune Place, "Federal Trust Building,  134 South 13th Street,  10th Floor,  Suite 1000", Lincoln, NE, 68508]
[Estradanas, "1111 N 102nd Court,  Suite 231", Omaha, NE, 68114]
[Fargo, "3310 Fiectner Drive,  Suite 108", Fargo, ND, 58103]
[Fangs, 650 Third Avenue South, Minneapolis, MN, 55402]
[China Palace, 3605 Hwy 52 North, Rochester, MN, 55901]
[Big Daddy Barbeque, "1005 Ikon Drive,  Suite G, ", Jefferson City, MO, 65109]
[Wolfs, "3315 E. Ridgeview Street,  Suite 4000", Springfield, MO, 65804]
[A Cut Above, 30501 Agoura Road, Agoura Hills, CA, 91301]
[Ranch House, 650 Harry Road, San Jose, CA, 95120]
[Burgers and Fries, 5100 California Avenue, Bakersfield, CA, 93309]
[Hofbrau Deluxe, 600 Anton Blvd, Costa Mesa, CA, 92626]
[Jean's Place, 100 N. Sepulveda Blvd, El Segundo, CA, 90245]
[Nattos, 1001 E. Hillsdale Blvd, Foster City, CA, 94404]

Aquí cabe destacar una cosa. Algunas líneas tienen direcciones compuestas que incorporan una coma, por ejemplo: "3315 E. Ridgeview Street,  Suite 4000"
En estos casos, en lugar de obtener un array de 5 elementos, nos dará un array de 6 elementos, porque esa address compuesta también será "troceada" por el método split().

Para este ejercicio, nos da igual que esto ocurra, porque solo nos va a interesa el último elemento, el zipcode.
Pero si nos pidieran trabajar también con el dato address, habría que tener en cuenta que en ocasiones este dato lo íbamos a obtener separado en dos elementos.

Bueno, dicho esto, el ejercicio nos pide mostrar los datos únicamente de los restaurantes cuyo zipcode comience por 6.
Puesto que ya tenemos los datos separados, para hacer esto nos basta con preguntar si el último elemento de cada array, que es donde se encuentra el código postal, comienza por 6.
Y si esto se cumple, pues mostramos los datos en pantalla.

Código: [Seleccionar]
public class LeerFichero {

public static void main(String[] args) {
//Ruta donde encontrar el fichero de texto
String rutaTXT = "D:\\Programacion\\FicherosTXT\\restaurante.txt";

try {
//Configuramos lector de ficheros
BufferedReader lector = new BufferedReader(new FileReader(rutaTXT));
//Leemos línea
String linea = lector.readLine();
//Mientras la linea sea distinto de null, es decir, hay líneas para leer
while (linea != null) {
//Separamos los datos en un array
String[] datos = linea.split(",");

//Preguntamos si último elemento, el zipcode comienza por 6
if (datos[datos.length - 1].startsWith("6"))
System.out.println(Arrays.toString(datos)); //Mostramos restaurante

//Leemos siguiente línea, si no es null, se repetirá el bucle
linea = lector.readLine();
}
//Lectura terminada, cerramos lector
lector.close();
} catch (FileNotFoundException e) {
System.out.println("No se encuentra fichero: " + rutaTXT);
} catch (IOException e) {
System.out.println("No se puede acceder a " + rutaTXT);
}

}
}

De este modo, ahora en pantalla solo vemos los restaurantes que comienzan por 6:
Citar
[Vietnam Restaurant, 1615 Commerce Parkway, Bloomington, IL, 61704]
[Chops and Ribs, 71 S. Wacker Drive Chicago, Chicago, IL, 60606]
[Molinarinari, "1701 River Drive,  Suite 306", Moline, IL, 61265]
[Siam Cusine, "3201 W White Oaks Drive,  Suite 204", Springfield, IL, 62704]
[Irifune Place, "Federal Trust Building,  134 South 13th Street,  10th Floor,  Suite 1000", Lincoln, NE, 68508]
[Estradanas, "1111 N 102nd Court,  Suite 231", Omaha, NE, 68114]
[Big Daddy Barbeque, "1005 Ikon Drive,  Suite G, ", Jefferson City, MO, 65109]
[Wolfs, "3315 E. Ridgeview Street,  Suite 4000", Springfield, MO, 65804]

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

 

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