Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cortar Fichero de texto. (https://www.clubdelphi.com/foros/showthread.php?t=54934)

johurgi 03-04-2008 11:52:15

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.

ixMike 03-04-2008 13:57:47

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.

Caro 03-04-2008 14:50:44

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

BlueSteel 03-04-2008 15:41:29

hace dias hice estos.. y funca super
 
Cita:

Empezado por johurgi (Mensaje 277246)
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 :p:D


La franja horaria es GMT +2. Ahora son las 22:16:44.

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