Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas
Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas

lunes, 1 de agosto de 2011

Información ficheros texto

He estado haciendo unas pruebas con funciones de manejo de ficheros en C para quitar el óxido a mis conocimientos de C. Como resultado he hecho un programilla para mostrar cierta información relativa a un fichero de texto. Podemos obtener el número de caracteres, palabras y líneas en un fichero de texto. El nombre del fichero se pasa como parámetro en la línea de comando. Es decir, el modo de ejecutar el programa sería el siguiente:
                       programa nombre_fichero 
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[])
{
  FILE *fichero;
  char c;
  int contador_char=0, contador_lineas=0, contador_palabras=0, contador_char_palabra=0;

  if (argc==2) {
    fichero = fopen(argv[1],"r");
    if (!feof(fichero)) contador_lineas = 1;
    while ((c=fgetc(fichero)) != EOF) {
      if ((((int)c) != 32) && (c!='\n')) {
        contador_char++;
        contador_char_palabra++;
      }
      if (((c==' ') || (c=='\n')) && (contador_char>0)) {
        contador_palabras++;
        contador_char_palabra=0;
      }
      if (c=='\n') contador_lineas++;
    }
    if (contador_char_palabra>0) contador_palabras++;

    fclose(fichero);

    printf("El numero de caracteres en el fichero es: %d\n", contador_char);
    printf("El número de palabras en el fichero es: %d\n", contador_palabras);
    printf("El numero de lineas en el fichero es: %d\n",contador_lineas);
  }
  else {
    printf("Uso: file_counters nombrefichero");
  }
  return 0;
}

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();
}
}
}
}
}