Está en la página 1de 4

Práctica 5:

Ficheros y estructuras de datos indexadas


Objetivo de la práctica
El objetivo de esta práctica es introducir los Ficheros de texto. Utilizaremos la clase Scanner con un
flujo de datos asociado a un fichero de texto (FileReader) en lugar de leer de teclado, y la clase
PrintWriter para escribir en un flujo de datos asociado a un fichero de texto en lugar de en la pantalla.
Además, utilizaremos el método split de las cadenas para separar las líneas por un carácter y obtener un
vector de cadenas, y los métodos Float.parseFloat(), Double.parseDouble(), Integer.parseInt() para
convertir cadenas que representan enteros o reales en sus valores numéricos. El primer ejercicio te
servirá para para introducirte todos estos aspectos, y los siguientes para que puedas poner en práctica lo
aprendido.

Ejercicios de la sesión práctica


1. Escribir un programa Java que procese le fichero de texto “log.txt” que contiene un log de
eventos, partiéndolo en dos ficheros de salida conforme a la siguiente condición: por un lado, uno
de los ficheros llamado “pares.txt” estará formado por aquellos eventos que hayan tenido lugar
en meses pares; y, por otro lado, el segundo de los ficheros denominado “impares.txt” contendrá
aquellos eventos que correspondan a meses impares. Además, el método deberá imprimir en pantalla
el número de eventos que corresponden a cada fichero.
La estructura del fichero de texto consta de una primera línea de cabecera en la que se indican los
campos almacenados por evento separados por comas, y a continuación una línea por cada evento.
Los ficheros de salida deben mantener la misma estructura.

Fecha,Hora,ID-Estudiante,Evento,Origen,Dirección-IP
05/11/2018,10:17,27298,Curso: Fundamentos de informática (2017-2018),web,155.210.152.165
05/11/2018,10:15,27298,Curso: Fundamentos de informática (2017-2018),web,155.210.152.165
05/11/2018,10:15,27298,Curso: Fundamentos de informática (2017-2018),web,155.210.152.165
05/11/2018,10:14,27298,Curso: Fundamentos de informática (2017-2018),web,155.210.152.165
05/11/2018,10:14,27298,Curso: Fundamentos de informática (2017-2018),web,155.210.152.165
04/11/2018,21:25,108390,Tarea: Entrega prácticas hasta sesión 5,web,79.151.207.0
04/11/2018,21:25,108390,Curso: Fundamentos de informática (2017-2018),web,79.151.207.0
04/11/2018,21:24,108390,Curso: Fundamentos de informática (2017-2018),web,79.151.207.0
04/11/2018,20:03,102850,Curso: Fundamentos de informática (2017-2018),web,83.41.214.253
04/11/2018,17:26,102483,Curso: Fundamentos de informática (2017-2018),web,139.47.89.30
02/11/2018,17:34,102483,Curso: Fundamentos de informática (2017-2018),web,83.34.242.165

Ejemplo de salida por pantalla:


Número de líneas (meses pares) = 18022
Número de líneas (meses impares) =21763

La lectura en este problema la hacemos de un fichero y la escritura en dos ficheros. Observa como
se asocia un flujo de datos de entrada al fichero de texto “log.txt”, y como se asocia Scanner en la
declaración de entrada a dicho flujo de dato. También se crean dos flujos de datos de salida a los
ficheros “pares.txt” e “impares.txt” y se definen las variables salidaPares y
salidaImpares de tipo PrintWriter para escribir en los respectivos ficheros. Todas las
Prácticas de Informática

acciones relacionadas con flujos de datos deben envolverse en un try-catch que captura las
excepciones relacionadas con las entradas y salidas de ficheros.
La lectura del fichero log.txt se hace línea a línea mediante entrada.nextLine() hasta
que no queden más líneas (while(entrada.hasNext()).
Cada línea almacena en una variable String linea, y se divide mediante el método
linea.split(“,”) en las cadenas que se almacenan en un vector de cadenas String[] datos.
El número de cadenas almacenadas se encuentra en datos.length, y a cada cadena almacenada
accedemos mediante el índice datos[i], donde i va de 0 a datos.length-1. En este caso, la
primera cadena en datos[0] contiene una fecha en formato “dd/mm/aaaa” . Volvemos a dividir esta
cadena mediante el método datos[0].split(“/”) y obtenemos un vector con tres cadena
diasMesAno. diasMesAno[0] es una cadena representando el día, diasMesAno[1] representa
el mes, y diasMesAno[2] representa el año. Podemos convertir la cadena que representa un
número en su valor numérico mediante Integer.parseInt(diasMesAno[1]) obteniendo el
valor numérico. En función si el mes es par o impar escribimos toda la línea leída en el fichero de
meses pares o el fichero de meses impares.
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;
import java.io.FileWriter;
import java.io.PrintWriter;
public class ParesImpares {
public static void main(String[] args) {
try {
Scanner entrada=new Scanner (new FileReader("log.txt")); //fichero de entrada
PrintWriter salidaPares = new PrintWriter (new FileWriter("pares.txt"));//fichero Meses pares
PrintWriter salidaImpares=new PrintWriter (new FileWriter("impares.txt"));//fichero meses imp
int eventos=0; //contador de eventos
int eventosPares=0; //contador de eventos meses pares
int eventosImpares=0; //contador de eventos meses impares
while(entrada.hasNext()) { //empezamos a procesar el fichero hasta su fin
eventos++;
String linea = entrada.nextLine(); //capturamos la primera linea
String [] datos = linea.split(","); //Separamos la línea en sus distintos campos
String fecha = datos[0];
String[] diaMesAno= fecha.split("/");
//String dia1=diaMesAno[0] String dia1=diaMesAno[0];
String mes1=diaMesAno[1];
//String ano1 =diaMesAno[2];
int dia=0, mes=0, ano=0;
// dia = Integer.parseInt(dia1);
mes = Integer.parseInt(mes1);
// ano=Integer.parseInt(ano1);
if((mes%2==0)) {
eventosPares++;
salidaPares.println(linea);
} else {
eventosImpares++;
salidaImpares.println(linea);
}
} //end while
entrada.close();
salidaPares.close();
salidaImpares.close();
System.out.println("Número de eventos procesados: "+eventos);
System.out.println("Número de eventos en el meses pares: "+eventosPares);
System.out.println("Número de eventos en el meses impares: "+eventosImpares);
} catch(java.io.IOException ex) {
System.out.print(ex.getMessage());
}
}
}
Estudia este programa, entiéndelo y ejecútalo.

Departamento de Informática e Ingeniería de Sistemas


Prácticas de Informática

2. Una galería de arte almacena en un fichero de texto, llamado “obras.txt”, el listado de obras con
las que ha negociado durante el último año. La información de cada obra es guardada en una línea
diferente, separadas por comas, y conforme el siguiente formato: un entero que representa el código
de inventario asignado a la obra, un entero que corresponde con el precio que se pagó por su
adquisición, un entero que representa el precio de venta (si no ha sido vendida aún, en vez de un
entero, aparecerá un carácter ‘*’), y, finalmente, el título de la obra. A continuación, se muestra un
posible ejemplo de fichero:

Debes escribir un programa en Java que encuentre aquellas obras vendidas donde el beneficio
obtenido sea como mínimo un 20% del precio de compra. Las obras que satisfagan la condición
serán almacenadas en un fichero de texto de salida. Los nombres del fichero de entrada y salida
se preguntarán al usuario Por cada obra se guardará en una línea diferente su código de inventario
y su título en el fichero de salida. En el ejemplo anterior, sólo las obras con código 4563 y 8934
deberían ser guardadas en el fichero de salida.

3. El “banco malo” ha guardado en un fichero de texto los pisos que tiene pendientes de vender. En
cada línea del fichero se almacena la información de un piso. Más concretamente, cada línea
contiene: un número real que determina la urgencia de la venta (con valor comprendido entre 0,0 y
1,0, representando poco o muy urgente, respectivamente), un número entero que corresponde con el
código postal de la calle donde está localizado el piso, y el nombre de la calle (sin número de portal).
En la figura adjunta se puede observar un ejemplo de fichero (parte de la izquierda de la figura,
“Fichero de texto de entrada”) donde se describe la información de diez pisos pendientes de venta.

SE PIDE escribir en Java un programa que pida al usuario el nombre del fichero de entrada, el
nombre del fichero de salida y un código postal. El fichero de entrada será conforme al formato
anterior y contiene información sobre pisos pendientes de ser vendidos. El programa debe generar

Departamento de Informática e Ingeniería de Sistemas


Prácticas de Informática

un fichero con el nombre indicado para el fichero de salida donde se almacenarán todos los pisos
cuyo código postal sea el código indicado. Este fichero de salida contendrá una línea por piso y
almacenará únicamente su urgencia de venta y su dirección. En la figura adjunta se muestra cuál
debería ser el fichero de salida (parte derecha de la figura, “Fichero de texto de salida”), dado el
fichero anterior de entrada, para el código postal 50003.

4. El Ayuntamiento de Zaragoza ha instalado un nuevo sistema de radar que almacena en un fichero de


texto la información diaria de los vehículos infractores. En la figura de la izquierda (“multas.txt”) se
muestra un ejemplo de fichero de un día cualquiera. En cada línea se guarda la información de un
infractor concreto: la velocidad a la que iba el vehículo (representada por medio de un número
entero), la matrícula (en formato cadena de caracteres y conforme al estándar de DDDD-LLL, donde
D es un dígito y L una letra mayúscula), y la hora de la infracción (en formato cadena y según la
representación HH:MM). La información está separada por espacios en blanco. En este caso, el radar
detectó ocho infracciones.

5. A partir de un fichero de infracciones graves (como el que resulta de la ejecución del ejercicio
anterior) se quiere conocer el número de franjas horarias de un día en las que se han registrado
infracciones y el porcentaje de infracciones que tienen lugar en cada una de estas franjas. En este
caso, las franjas horarias tienen una duración de 1 hora, es decir, son de las 00:00 a las 00:59, de la
1:00 a la 1:59, de las 2:00 a las 2:59,… de las 23:00 a las 23:59; por tanto, un día tiene 24 franjas
horarias. SE PIDE programar en Java el siguiente método,
public static void probabilidadSerMultado (String input)

que, a partir de un fichero de entrada, llamado input, muestre por pantalla la información previamente
mencionada: número de franjas que registraron infracciones y su porcentaje con respecto el total de
infracciones de ese día. Por ejemplo, para el fichero “multasRes.txt”, mostrado en la parte derecha
de la figura del ejercicio anterior, la salida por pantalla después de ejecutar el método debería ser:
El número de franjas horarias con multas es = 4
Porcentaje de sanciones entre las 9:00-9:59 es 0.2
Porcentaje de sanciones entre las 11:00-11:59 es 0.2
Porcentaje de sanciones entre las 12:00-12:59 es 0.4
Porcentaje de sanciones entre las 13:00-13:59 es 0.2

Departamento de Informática e Ingeniería de Sistemas

También podría gustarte