Hola amigo ags88
Creo que te han dado dos muy buenas soluciones, tanto generando un TDataSet como con un Tokenizer para el manejo de tus datos, inclusive ya casi te han dado el código para hacer la inserción (era cosa de que cambiaras los valores que te mostraban por los tuyos), pero me agrada que hagas tu propio esfuerzo por conseguirlo...
Ya casi lo tienes, aquí es necesario que comprendas algo importante, antes de hacer nada:
1. Para poder hacer un
insert into en tu base de datos, necesitas tener ya todos los datos que van en cada uno de los campos a llenar.
2. Es importante que distingas lo que es un registro y lo que son los campos. Tu vas a insertar registro por registro (cada línea de tu archivo es un registro) pero vas a insertar N campos en cada uno de los registros (cada dato separado por | es un campo, o un dato que va en un campo)
Para poder utilizar tu código, podrías ir guardando cada dato en una variable para que cuando ya tengas todos los datos que van en cada campo, es decir, cuando hayas terminado de leer tu primera linea del archivo, guardes en la tabla y pases a la siguiente línea. Te recomiendo que uses un arreglo para ir guardando en cada posición, cada dato o valor y después podamos insertar.
procedure TForm2.Button1Click(Sender: TObject);
var
vFile: TStringList;
cadena,Registro,cadena2:string;
I,k,j, Index: Integer; // Declaro la variable Index
Datos: Array of String; // Si sabes cuantos campos o cuantos datos contiene cada linea, puedes definirlo así-> Datos: Array[1..x] of String; donde x es el numero de campos
begin
//declaro una variable que sirve para leer archivos de texto
// creamos el componente
vFile:= TStringList.Create;
try
vFile.LoadFromFile('c:\tmp_ctaDeMov.txt');
for I := 0 to vFile.Count - 1 do
begin
//asigno una linea a cadena
cadena:= vFile.Strings[I];
//length me arroja la cantidad de caracteres que tiene mi linea te texto
k:=Length(cadena);
Index := 0; // Inicializamos Index
for j := 0 to k do
begin
//con copy boy copiando caracter por caracter
cadena2:=Copy(cadena,j,1);
// comparo si el caracter es igual a | si es asi que me lo muestre.
if cadena2='|' then
begin
// ShowMessage(Registro); {En vez de mostrarlo lo vamos a guardar en la variable Datos}
Datos[Index] := Registro;
Inc(Index); //Incrementamos Index en 1
Registro:='';
end
// si no boy armando mi texto que desarme ya separado por |
else
begin
Registro:=Registro + cadena2;
end
// Insertamos el primer registro
with qryInsercion do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO LATABLA (clave,nombre,folio,campoN) VALUES (:clave,:nombre,:folio,:campoN) ');
ParamByName('clave').AsString := Datos[0];
ParamByName('nombre').AsString := Datos[1];
ParamByName('folio,:').AsString := Datos[2];
ParamByName('campoN').AsString := Datos[3];
ExecSql;
end;
end;
end;
finally
vFile.Free;//destruimos el componente
end;
end;
Espero haberte ayudado un poco. Cualquier cosa, aquí andamos
Saludox !