martes, 12 de julio de 2011

Almacenar datos en ficheros (I)


Hemos empezado a ver distintos modos de almacenar nuestra información utilizando sistemas informáticos. Durante los primeros intentos de crear bases de datos se utilizaban ficheros de texto. Dos de las técnicas utilizadas eran: asignar una longitud fija a cada campo almacenado, o separar los valores de los distintos campos por comas.
He decidido crear una pequeña aplicación en .NET con un formulario para recoger una serie de datos y, posteriormente, guardar dichos datos utilizando el formato seleccionado. Los ficheros generados se pueden importar para utilizarlos en otras aplicaciones destinadas al manejo y almacenamiento de datos (por ejemplo, sistemas gestores de bases de datos y hojas de cálculo).
La siguiente versión de la aplicación permitirá guardar, consultar y modificar los datos almacenados.
En la imagen siguiente se puede ver el formulario para introducir los datos.

A continuación se pueden ver los resultados obtenidos tras guardar los datos en los distintos formatos definidos (longitud de campos fija y valores separados por comas).


Finalmente, adjunto el código que permite realizar las operaciones requeridas para realizar la tarea que pretendemos.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

/* Método que se ejecuta al pulsar el botón Guardar datos */
private void btnGuardarDatos_Click(object sender, EventArgs e)
{
string cadena = "";
string nombre, apellidos, edad, localidad, codPostal, dni, apodo, fechaNac;
string telefono, numHijos, fumador, estatura, tallaZapato, peso, sueldo;
string lateralidad, comentarios;
string path = "";
FileStream fs = null;

/* Longitud fija de los campos */
if (cboFormato.Text.CompareTo("Longitud fija") == 0)
{
path = "FixedLength.txt";
nombre = txtNombre.Text.PadRight(15);
apellidos = txtApellidos.Text.PadRight(20);
edad = txtEdad.Text.PadRight(3);
localidad = txtLocalidad.Text.PadRight(20);
codPostal = txtCodPostal.Text.PadRight(5);
dni = txtDNI.Text.PadRight(9);
apodo = txtApodo.Text.PadRight(10);
fechaNac = txtFechaNac.Text.PadRight(8);
telefono = txtTelefono.Text.PadRight(9);
numHijos = txtNumHijos.Text.PadRight(2);
fumador = chkFumador.Checked == true ? "1" : "0";
fumador = fumador.PadRight(1);
estatura = txtEstatura.Text.PadRight(4);
tallaZapato = txtTallaZapato.Text.PadRight(2);
peso = txtPeso.Text.PadRight(5);
sueldo = txtSueldo.Text.PadRight(8);
lateralidad = cboLateralidad.Text.Substring(0, 1).PadRight(1);
comentarios = txtObservaciones.Text.PadRight(200);

cadena = nombre + apellidos + edad + localidad + codPostal + dni + apodo + fechaNac + telefono + numHijos;
cadena = cadena + fumador + estatura + tallaZapato + peso + sueldo + lateralidad + comentarios;

MessageBox.Show("*" + cadena + "*");
}

/* Campos separados por comas (CSV) */
if (cboFormato.Text.CompareTo("CSV") == 0)
{
path = "CSV.csv";
nombre = txtNombre.Text.Trim();
apellidos = txtApellidos.Text.Trim();
edad = txtEdad.Text.Trim();
localidad = txtLocalidad.Text.Trim();
codPostal = txtCodPostal.Text.Trim();
dni = txtDNI.Text.Trim();
apodo = txtApodo.Text.Trim();
fechaNac = txtFechaNac.Text.Trim();
telefono = txtTelefono.Text.Trim();
numHijos = txtNumHijos.Text.Trim();
fumador = chkFumador.Checked == true ? "1" : "0";
estatura = txtEstatura.Text.Trim();
tallaZapato = txtTallaZapato.Text.Trim();
peso = txtPeso.Text.Trim();
sueldo = txtSueldo.Text.Trim();
lateralidad = cboLateralidad.Text.Substring(0, 1);
comentarios = txtObservaciones.Text.Trim();

cadena = nombre + "," + apellidos + "," + edad + "," + localidad + "," + codPostal + "," + dni + "," + apodo + "," +
fechaNac + "," + telefono + "," + numHijos + "," + fumador + "," + estatura + "," + tallaZapato + "," + peso +
"," + sueldo + "," + lateralidad + "," + comentarios;

MessageBox.Show("*" + cadena + "*");
}

/* Almacenar los datos en un fichero XML */
if (cboFormato.Text.CompareTo("XML") == 0)
{
/* Próxima versión */
}

if (!File.Exists(path))
{
fs = File.Create(path);
fs.Close();
}
if (File.Exists(path))
{
StreamWriter sw = new StreamWriter(path);
sw.WriteLine(cadena);
sw.Close();
}
}

/* Método auxiliar que divide una cadena con campos de longitud fija y obtiene los
valores correspondientes a cada uno de los campos */
private void fixedLength2form(string cadenaLongFija)
{
string fumador, lateralidad;

fumador = cadenaLongFija.Substring(101,1);
lateralidad = cadenaLongFija.Substring(121,1);

txtNombre.Text = cadenaLongFija.Substring(0, 15); ;
txtApellidos.Text = cadenaLongFija.Substring(15, 20);
txtEdad.Text = cadenaLongFija.Substring(35, 3); ;
txtLocalidad.Text = cadenaLongFija.Substring(38, 20);
txtCodPostal.Text = cadenaLongFija.Substring(58, 5);
txtDNI.Text = cadenaLongFija.Substring(63, 9);
txtApodo.Text = cadenaLongFija.Substring(72, 10);
txtFechaNac.Text = cadenaLongFija.Substring(82, 8);
txtTelefono.Text = cadenaLongFija.Substring(90, 9);
txtNumHijos.Text = cadenaLongFija.Substring(99, 2);
chkFumador.Checked = fumador.CompareTo("1") == 0 ? true : false;
txtEstatura.Text = cadenaLongFija.Substring(102, 4);
txtTallaZapato.Text = cadenaLongFija.Substring(106, 2);
txtPeso.Text = cadenaLongFija.Substring(108, 5);
txtSueldo.Text = cadenaLongFija.Substring(113, 8);
if (lateralidad.CompareTo("D") == 0) cboLateralidad.SelectedIndex = 0;
if (lateralidad.CompareTo("Z") == 0) cboLateralidad.SelectedIndex = 1;
if (lateralidad.CompareTo("A") == 0) cboLateralidad.SelectedIndex = 2;
txtObservaciones.Text = cadenaLongFija.Substring(122, 200);

}

/* Método auxiliar que divide una cadena de campos separados por comas y obtiene los valores
correspondientes a cada uno de los campos almacenados */
private void csv2form(string cadenaCSV)
{
string[] aElementosCadena;
string lateralidad;

aElementosCadena = cadenaCSV.Split(',');
txtNombre.Text = aElementosCadena[0];
txtApellidos.Text = aElementosCadena[1];
txtEdad.Text = aElementosCadena[2];
txtLocalidad.Text = aElementosCadena[3];
txtCodPostal.Text = aElementosCadena[4];
txtDNI.Text = aElementosCadena[5];
txtApodo.Text = aElementosCadena[6];
txtFechaNac.Text = aElementosCadena[7];
txtTelefono.Text = aElementosCadena[8];
txtNumHijos.Text = aElementosCadena[9];
if (aElementosCadena[10].CompareTo("1") == 0) chkFumador.Checked = true;
else chkFumador.Checked = false;
txtEstatura.Text = aElementosCadena[11];
txtTallaZapato.Text = aElementosCadena[12];
txtPeso.Text = aElementosCadena[13];
txtSueldo.Text = aElementosCadena[14];
lateralidad = aElementosCadena[15];
if (aElementosCadena[15].CompareTo("D") == 0) cboLateralidad.SelectedValue = 0;
if (aElementosCadena[15].CompareTo("Z") == 0) cboLateralidad.SelectedValue = 1;
if (aElementosCadena[15].CompareTo("A") == 0) cboLateralidad.SelectedValue = 2;
txtObservaciones.Text = aElementosCadena[16];

}

/* Método que se ejecuta al pulsar el botón Abrir fichero. En este método se abre el fichero
que se corresponde con el método de almacenamiento elegido (longitud fija o valores separados
por comas), se lee la línea que almacena los datos y se obtienen los valores para cada uno
de los campos. */
private void btnAbrirFichero_Click(object sender, EventArgs e)
{
string path = "";
string linea = "";

if (cboFormato.Text.CompareTo("Longitud fija") == 0)
{
path = "FixedLength.txt";
if (File.Exists(path))
{
TextReader tr = new StreamReader(path);
linea = tr.ReadLine();
MessageBox.Show("La línea es: " + linea);
fixedLength2form(linea);
tr.Close();
}
}
if (cboFormato.Text.CompareTo("CSV") == 0)
{
path = "CSV.csv";
if (File.Exists(path))
{
TextReader tr = new StreamReader(path);
linea = tr.ReadLine();
csv2form(linea);
tr.Close();
}
}
}
}
}

No hay comentarios:

Publicar un comentario