Sei sulla pagina 1di 4

crea archivo de texto delimitado procedure TForm1.

Button1Click(Sender: TObject); procedure GrabaDelimitado( Datos:TDatasource; Fichero: string; Delimitador:char); var f : textfile; n : integer; Linea : string; begin AssignFile(f,Fichero); Rewrite(f); With Datos.DataSet do begin DisableControls; {Vamos al primer registro} {First record} First; {Vamos registro a registro, hasta el final} {From first to last, one by one} While Not Eof do begin Linea:=''; {Recorremos todos los campos del registro} {all field of the record} for n:=0 to FieldCount-1 do begin If (Fields[n] is TBlobField) or (Fields[n] is TGraphicField) or (Fields[n] is TMemoField) or (Fields[n].IsNull) then Linea:=Linea+Delimitador else Linea:=Linea+Delimitador+Fields[n].AsString; end; {Del For} Linea:=Copy(Linea,2,Length(Linea)-1); Memo1.Lines.Add(Linea); writeln(f,Linea); Next; end; {Del While} EnableControls; end; {Del With} CloseFile(f); end; begin GrabaDelimitado(DataSource1,'c:\kk\Texto.txt',','); end; //**** * * * * * * * *

Aqui tienes dos funciones tiles para separar una string conteniendo varias palabras separadas por un mismo caracter (o una misma string). Puede servirnos para importar en nuestra database un fichero separado por comas, por ejemplo. GetTokenCount nos d el nmero de tokens (palabras) que contiene la string GetToken nos devuelve el token que le especifiquemos. Un ejemplo que separa una cadena con varias palabras separadas por comas y las va aadiendo en un TMemo: Pon un TMemo (Memo1 y un TButton (Button1) en tu form Mete este cdigo en el OnClick de Button1:

procedure TForm1.Button1Click(Sender: TObject); function GetToken(Cadena:string; Separador:char; Token:integer):string; overload { Cadena es la string en la que buscar el token Separador es la string que separa cada token Token es el nmero de token que buscamos Cadena is the string in that look for the token Separador is the token separator Token is the desired token number } var Posicion:integer; begin while Token > 1 do begin Delete(Cadena,1,Pos(Separador,Cadena)); Dec(Token); end; Posicion:=Pos(Separador,Cadena); if Posicion=0 then result:=cadena else Result:=Copy(Cadena,1,Posicion-Length(Separador)); end; function GetToken(Cadena, Separador: String; Token: Integer): String; overload var Posicion: Integer; begin while Token > 1 do begin Delete(Cadena, 1, Pos(Separador,Cadena)+Length(Separador)-1); Dec(Token);

end; Posicion:= Pos(Separador, Cadena); if Posicion = 0 then Result:= Cadena else Result:= Copy(Cadena, 1, Posicion-1); end; function GetTokenCount(Cadena:string; Separador:char):integer; overload; var Posicion:integer; begin Posicion:=Pos(Separador,Cadena); Result:=1; if Cadena <> '' then begin if Posicion <> 0 then begin while Posicion <> 0 do begin Delete(Cadena,1,Posicion); Posicion:=Pos(Separador,Cadena); Inc (Result); end; end; end else Result:=0; end; function GetTokenCount(Cadena, Separador: String): Integer; overload; var Posicion: Integer; begin if Cadena <> '' then begin Posicion:= Pos(Separador, Cadena); Result:= 1; while Posicion <> 0 do begin Inc(Result); Delete(Cadena, 1, Posicion+Length(Separador)-1); Posicion:= Pos(Separador, Cadena); end; end else Result:=0; end; var SeparadaPorComas :string; n :integer; begin Memo1.Lines.Add('Ejemplo con separador de 1 caracter'); SeparadaPorComas:='uno,dos,,cuatro,cinco'; for n:=1 to GetTokenCount(SeparadaPorComas,',') do Memo1.Lines.Append( GetToken(SeparadaPorComas,',',n) );

Memo1.Lines.Add('Ejemplo con separador de varios caracteres'); SeparadaPorComas:='uno[SEP]dos[SEP][SEP]cuatro[SEP]cinco'; for n:=1 to GetTokenCountS(SeparadaPorComas,'[SEP]') do Memo1.Lines.Append( GetToken(SeparadaPorComas,'[SEP]',n) ); end;

Si te fijas, cada una de las dos funciones GetToken y GetTokenCount parece que est definida dos veces, no? Pues si, esto es as para poder optimizar su uso, dado que no es lo mismo utilizar un separador de un slo caracter a usar un separador de varios caracteres, dado que en este segundo caso hay que andar sumando y restando (y calculando) la longitud del separador. As, he definido las dos funciones con la directiva overload, lo que nos permitir usar separadores o bien de un caracter o bien de varios de manera automtica. Es decir, si llamamos a GetToken asi: UnToken:=GetToken(Cadena,',',2);

Pues estaremos usando la version para separador de un caracter. Sin embargo, si la llamamos as: UnToken:=GetToken(Cadena,'###',2);

Potrebbero piacerti anche