Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2008
Avatar de johurgi
johurgi johurgi is offline
Miembro
 
Registrado: jul 2006
Posts: 95
Poder: 18
johurgi Va por buen camino
Cortar Fichero de texto.

Hola a todos de nuevo,

Alguien sabe como puedo cortar cadenas de un fichero de texto. Las cadenas son de tamanyo fijo.

Código:
codigo1 apellido11 apellido12,nombre1    ciudad1   codigopostal1
codigo2 apellido21 apellido22,nombre2    ciudad2   codigopostal2
codigo3 apellido31 apellido32,nombre3    ciudad3   codigopostal3
codigo4 apellido41 apellido42,nombre4    ciudad4   codigopostal4
codigo5 apellido51 apellido52,nombre5    ciudad5   codigopostal5
...
El problema es que tengo que ir cortandolas y almacenandolas en una base de datos, y ya he probado a cargar el fichero en un richedit y me pierde datos por lo que no es muy fiable.

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 03-04-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Hola.

Primeramente, si el archivo de texto no tiene formato (es decir, del que se puede abrir con el bloc de notas) pues entonces mejor ábrelo con un TMemo, o incluso si no se va a mostrar al usuario, en un objeto TStrings creado por ti mismo.

En cuanto a cortar las cadenas, tan sólo tendrías que ir recorriendo línea por línea en un bucle, coger las distintas partículas de texto mediante la función Copy (ya que has dicho que tienen longitud fija, y almacenarlo en una base de datos. Quedaría algo así:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
  AnchoCodigo = 5;
  AnchoApellido = 25;
  //...
  //Aquí declara todas las constantes con el ancho que tenga cada campo
  //...
var
  S: TStrings; //Donde se almacenará el texto
  Codigo, Apellido1, Apellido2, Nombre, Ciudad, CodPostal: String;
  N: Integer;
begin
  //Edit1 almacena el nombre del archivo a leer
  S:=TStringList.Create;
  S.LoadFromFile(Edit1.Text);
  for n:=0 to S.Count-1 do
    begin
    Codigo:=Copy(S[n], 0, AnchoCodigo);
    Apellido1:=Copy(S[n], AnchoCodigo+1, AnchoApellido);
    Apellido2:=Copy(S[n], AnchoCodigo+AnchoApellido+2, AnchoApellido);
    Nombre:=Copy(S[n], AnchoCodigo+AnchoApellido+AnchoApellido+3, AnchoNombre);
    //... y así con todos los campos

    //y ahora se añaden los datos
    Tabla.Insert;
    TablaCodigo.Value:=Limpiar(Codigo);
    TablaApellido1.Value:=Limpiar(Apellido1);
    TablaApellido2.Value:=Limpiar(Apellido2);
    TablaNombre.Value:=Limpiar(Nombre);
    //... y con el resto igual

    Tabla.Post;
    end;
  S.Free;
end;

La función Limpiar tendrás que declararla a parte. La he puesto porque al coger los campos con la función Copy con un ancho fijo, pues entonces al final de todos los campos tendrás espacios. Por ejemplo, si el ancho del campo nombre es 10 y tienes "Miguel", pues el dato que se guardará será "Miguel ", con cuatro espacios. La función Limpiar debería dejarlo en "Miguel". Pero eso ya te lo dejo a ti


Salu2.
Responder Con Cita
  #3  
Antiguo 03-04-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola johurgi, yo utilizaria un TStringList para leer el archivo y otro StringList para almacenar linea a linea, ademas en este ultimo utilizar sus propiedades Delimiter y DelimiterText donde nuestro delimitador seria el espacio en blanco.

Código Delphi [-]
var
 i, j : Integer;
 cadena : String;
 slFile, slLinea : TStringList;
begin
 slFile := TStringList.Create;
 slLinea := TStringList.Create;
 slLinea.Delimiter:=#32; //Definimos el delimitador para que lo use DelimitedText
 
 slFile.LoadFromFile('texto.txt'); //cargamos el archivo en el primero
 for i:=0 to slFile.Count-1 do
  begin
   cadena:='';
   slLinea.DelimitedText:=slFile[i]; //cargamos la linea donde cada cadena antes del espacio sera una posición en el StringList
   for j:=0 to slLinea.Count-1 do   //solo una pruebita paar ver lo que se tiene en slLinea
    cadena := cadena+' '+slLinea[j];
   showmessage(cadena);
  end;
end;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #4  
Antiguo 03-04-2008
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 24
BlueSteel Va por buen camino
Talking hace dias hice estos.. y funca super

Cita:
Empezado por johurgi Ver Mensaje
Hola a todos de nuevo,

Alguien sabe como puedo cortar cadenas de un fichero de texto. Las cadenas son de tamanyo fijo.

Código:
codigo1 apellido11 apellido12,nombre1    ciudad1   codigopostal1
codigo2 apellido21 apellido22,nombre2    ciudad2   codigopostal2
codigo3 apellido31 apellido32,nombre3    ciudad3   codigopostal3
codigo4 apellido41 apellido42,nombre4    ciudad4   codigopostal4
codigo5 apellido51 apellido52,nombre5    ciudad5   codigopostal5
...
El problema es que tengo que ir cortandolas y almacenandolas en una base de datos, y ya he probado a cargar el fichero en un richedit y me pierde datos por lo que no es muy fiable.

Gracias de antemano.
Hola johurgi

Mira.. yo tenia que pasar un archivo de texto que venia con columnas definidas a una base de datos... es super serncillo.. para eso utilice lo sgte componentes:

- TJvCsvDataSet -> de la Jvcl
- TDataSource -> vinculado al TJvCsvDataSet
- TDBGrid -> vinculado al TDataSource

le asignas el archivo de texto al TJvCsvDataSet y defines todos los campos y ancho de las columnas.. (ya sabes que cadenas son de tamanyo fijo)

si lo quieres hacer por codigo tengo esto para asingar el archivo

Código Delphi [-]
     DTexto.Active    := False;
     DTexto.FileName := Concat(Label1.Caption,'\',Archivo.Text); //obtengo la ruta de unTDirectoryListBox y un  TFileListBox....
     DTexto.Active    := True;
     Edit4.Text         := IntToStr(DTexto.RecordCount); // obtengo el numero de registros

donde DTexto es el TJvCsvDataSet

luego ejecuto este codigo pasa agregarlos a una Tabla (SQL Server y ADO)

Código Delphi [-]
Var
   i : Integer;
   nArchivo : String;
begin
     For i:=0 to DTexto.RecordCount-1 Do  
     Begin
          Datos.AQ_Edit.Close;
          Datos.AQ_Edit.Sql.Clear;
          Datos.AQ_Edit.SQL.Add('Insert Into Horario (Hor_Tipo, Per_Nro, Hor_Fecha)');
          Datos.AQ_Edit.SQL.Add('Values (:v01, :v02, :v03)');
          Datos.AQ_Edit.Parameters[0].Value := DTexto.fieldbyname('Tipo').AsString;
          Datos.AQ_Edit.Parameters[1].Value := IntToStr(StrToInt(DTexto.FieldByName('Ficha').asString));
          Datos.AQ_Edit.Parameters[2].Value := DTexto.fieldbyname('cFecha').AsString; // Aqui tenia otro proceso.. pero no viene al caso explicarlo
          Datos.AQ_Edit.ExecSQL;
          DTexto.Next;
     End;
     DTexto.Active   := False;
 
// Aqui renombro el archivo para que despues no lo encuentre y no tenga que cargar los eventos nuevamente...
     RenameFile(Concat(Label1.Caption,'\',Archivo.Text),ChangeFileExt(Concat(Label1.Caption,'\',Archivo.T  ext),'.ok'));

Espero que esto te sirva...


Salu2
__________________
BlueSteel

Última edición por BlueSteel fecha: 03-04-2008 a las 15:44:29.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Fichero de Texto Enorme muli Varios 8 19-02-2008 02:23:35
verificar fichero de texto arley_molina Varios 2 12-06-2006 20:52:40
Cortar fichero de audio FDB Varios 0 27-04-2005 19:15:37
Ayuda con fichero de texto jadelphi Varios 4 07-10-2004 09:43:14
como cortar texto de un edit superhopi Impresión 1 10-06-2003 13:03:03


La franja horaria es GMT +2. Ahora son las 05:56:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi