Ir al contenido


Foto

leer un archivo de texto delimitado por | e insertar en una tabla en sql


  • Por favor identifícate para responder
26 respuestas en este tema

#1 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 10:36

Hola de nuevo por aqui tengo un problema ya llevo mucho tiempo no e logrado terminarlo, mi pregunta o mi duda es como puedo leer un archivo de texto en delphi separados por | despues de leerlo o conforme va leyendo y encuentra un | que me lo inserte a la tabla dependiendo de que campo le asigne porfavor alguien puede asesorme:

por ejemplo en un archivo de texto tengo los siguientes datos



delphi
  1. pancho|rodriguez|lopez|24|mexico|soltero|
  2. edgar  | lopez    |trinidad|30|argentina|casado|
  3. etc



necesito leer estos datos y conforme va encontrando el caracter | que inserte en una tabla de la BD en sqlserver porfavor les agredeseria mucho, gracias.
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 10 julio 2013 - 10:50

Hace tiempo redacté una entrada en mi blog sobre leer archivos csv y tratarlos como un dataset. En enlace aquí:
http://elpoli.delphi...n-delphi-y-ado/

Ese artículo puede servirte de la siguiente manera:

  • Cambias el delimitador , por | en la cadena de conexión de ADO
  • Cargas tu archivo usado ADO en un TTable
  • Recorres el TTable insertando en SQL server cada campo de manera mucho más sencilla

  • 0

#3 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 10:54

Poliburro muchas gracias por tu atencion y tu tiempo no sabes cuanto me ayudas boy a intentarlo dios te regresara todo tu esfuerzo, bendiciones.
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 10 julio 2013 - 11:28

Poliburro muchas gracias por tu atencion y tu tiempo no sabes cuanto me ayudas boy a intentarlo dios te regresara todo tu esfuerzo, bendiciones.


Es un gusto ayudar amigo, si tienes más dudas con toda confianza comentalas que aquí entre todos te ayudaremos.
  • 0

#5 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 11:34

Intente con los componentes ADOconection pero no se puede hacer la conexion como puedo hacer con un simple boton mediante condigo?, utilizaria los componentes que estan en tu tuto, pero lo haria todo mediante condigo.
  • 0

#6 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 11:45

'no puede encontrar el archivo ISAM instalable eso me aparece entonces ps me daria lo mismo,
ya tengo como leer el archivo, la base de datos que utilizo esta en sqlserver y cuando lo importa lo extraigo a un bloc de notas
los datos me los separa por este cararter |, pero ya lo tengo ahora mi duda es como le ago para insertarlo a mi tabla porfavor me puedes ayudar, te muestro mi codigo de como leo mi archivo

asi leo mi archivo de texto


delphi
  1. vFile : TStringList;
  2. begin //primeramente hay que ordenar nuestro codigo
  3.   vFile := TStringList.Create ; //Creamos el componente vFile
  4.   try
  5.     vFile.LoadFromFile('c:\TXTSalida.txt'); //abro el archivo
  6.  
  7.     for I := 0 to vFile.Count - 1 do //recorre cada linea del archivo abierto en vFile
  8.     begin
  9.         cadena := vFile.Strings [i];  //asignamos una linea a la cadena
  10.         K:= Length(cadena); //obtiene el numero de caracteres de la linea o cadena


  • 0

#7 tmsanchez

tmsanchez

    Advanced Member

  • Miembros
  • PipPipPip
  • 85 mensajes

Escrito 10 julio 2013 - 01:57

Hola.

Para poder obtener los valores de una cadena separados por un delimitador hice ésta clase tratando de "emular" al StringTokenizer de java.



delphi
  1. unit StringTokenizer;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, StrUtils;
  7.  
  8. type
  9.   TStringTokens = array of string;
  10.  
  11.   TStringTokenizer = class
  12.       class function getTokens(Cadena,Separador:string):TStringTokens;
  13.       class function GetToken(Cadena,Separador:string;Token:integer):string; overload;
  14.       class function GetToken(Cadena:String;Separador:Char;Token:integer):string;overload;
  15. class function GetTokenCount(Cadena,Separador:string):integer;
  16.   end;
  17.  
  18. implementation
  19.  
  20.  
  21. { TStringTokenizer }
  22.  
  23. class function TStringTokenizer.GetToken(Cadena, Separador: string;
  24.   Token: integer): string;
  25. var
  26.   Posicion:integer;
  27. begin
  28.   while Token > 1 do begin
  29.     Delete(Cadena,1,Pos(Separador,Cadena));
  30.     Dec(Token);
  31.   end;
  32.  
  33.   Posicion:=Pos(Separador,Cadena);
  34.   if Posicion=0 then
  35.       Result:= TrimLeft(TrimRight(cadena))
  36.   else
  37.       Result:= TrimLeft(TrimRight(Copy(Cadena,1,Posicion-Length(Separador))));
  38. end;
  39.  
  40. class function TStringTokenizer.GetToken(Cadena: String; Separador: Char;
  41.   Token: integer): string;
  42. var
  43.   Posicion:integer;
  44. begin
  45.   while Token > 1 do begin
  46.     Delete(Cadena,1,Pos(Separador,Cadena));
  47.     Dec(Token);
  48.   end;
  49.  
  50.   Posicion:=Pos(Separador,Cadena);
  51.   if Posicion=0 then
  52.       Result:= TrimLeft(TrimRight(cadena))
  53.   else
  54.       Result:= TrimLeft(TrimRight(Copy(Cadena,1,Posicion-Length(Separador))));
  55.  
  56. end;
  57.  
  58. class function TStringTokenizer.GetTokenCount(Cadena,
  59.   Separador: string): integer;
  60. var
  61.   Posicion:integer;
  62. begin
  63.   Posicion:=Pos(Separador,Cadena);
  64.   Result:=1;
  65.  
  66.   if Cadena <> '' then
  67.   begin
  68.   if Posicion <> 0 then
  69.     while Posicion <> 0 do
  70.     begin
  71.       Delete(Cadena,1,Posicion);
  72.       Posicion:=Pos(Separador,Cadena);
  73.       Inc (Result);
  74.     end;
  75.   end
  76.   else
  77.     Result:=0;
  78. end;
  79.  
  80. class function TStringTokenizer.getTokens(Cadena,Separador:string):TStringTokens;
  81. var
  82.   tokens : TStringTokens;
  83.   I, totalTokens : integer;
  84. begin
  85.   totalTokens := GetTokenCount(cadena, separador);
  86.   SetLength(tokens, totalTokens);
  87.   for I := 0 to totalTokens-1 do
  88.       tokens[I] := GetToken(cadena, separador, I+1);
  89.   result := tokens;
  90. end;
  91.  
  92. end.



Y para insertar en la base suponiendo que tienes un TSQLQuery



delphi
  1. var
  2.   arregloCadena : TStringTokens;
  3.   laCadenaDeTexto : String;
  4. begin
  5.   laCadenaDeTexto := '001|ABCD|9999|OTROCAMPO';
  6.   arregloCadena := TStringTokenizer.getTokens(texto, '|');
  7.  
  8.   // para la inserción
  9.   with qryInsercion do
  10.   begin
  11.         Close;
  12. SQL.Clear;
  13. SQL.Add('INSERT INTO LATABLA (clave,nombre,folio,campoN) VALUES (:clave,:nombre,:folio,:campoN) ');
  14. ParamByName('clave').AsString := arregloCadena[0];
  15. ParamByName('nombre').AsString := arregloCadena[1];
  16. ParamByName('folio,:').AsString := arregloCadena[2];
  17. ParamByName('campoN').AsString := arregloCadena[3];
  18. ExecSql;
  19. end;



Espero te sea de utilidad.

Saludos.
  • 0

#8 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 02:19

gracias sanchez yo ya tengo un codigo que e logrado ir separando dato por dato cada que encuentra un | y lo muestro con un showmessage cada que encuetra a un | me lo muestra ahora lo que quiero es irlo insertando a la tabla en su respectivo campo ese es mi gran problema para mi seria como escalar el everest y quizas para ustedes sean como quitarle un dulce a un niño para es un gran reto para mi poder terminar esto les agradeceria mucho este es todo mi codigo hasta ahora:


delphi
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. var
  3. vFile: TStringList;
  4. cadena,Registro,cadena2:string;
  5. I,k,j: Integer;
  6. begin
  7. //declaro una variable que sirve para leer archivos de texto
  8.  
  9.   // creamos el componente
  10.   vFile:= TStringList.Create;
  11.   try
  12.     vFile.LoadFromFile('c:\tmp_ctaDeMov.txt');
  13.     for I := 0 to vFile.Count - 1 do
  14.     begin
  15.       //asigno una linea a cadena
  16.       cadena:= vFile.Strings[I];
  17. //length me arroja la cantidad de caracteres que tiene mi linea te texto
  18.       k:=Length(cadena);
  19.       for j := 0 to k do
  20.       begin
  21. //con copy boy copiando caracter por caracter
  22.         cadena2:=Copy(cadena,j,1);
  23. // comparo si el caracter es igual a | si es asi que me lo muestre.
  24.         if cadena2='|' then
  25.         begin
  26.  
  27.           ShowMessage(Registro);
  28.           Registro:='';
  29.         end
  30. // si no boy armando mi texto que desarme ya separado por |
  31.         else
  32.         begin
  33.           Registro:=Registro + cadena2;
  34.  
  35.         end
  36.  
  37.       end;
  38.  
  39.     end;
  40.  
  41.  
  42.   finally
  43.     vFile.Free;//destruimos el componente
  44.   end;
  45.  
  46. end;



ahora solo que queda insertar a la base de datos el problema es como lo ago de tal manera que los datos vallan
correctamente en sus respectivo campos

  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 10 julio 2013 - 03:17

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.



delphi
  1. procedure TForm2.Button1Click(Sender: TObject);
  2. var
  3. vFile: TStringList;
  4. cadena,Registro,cadena2:string;
  5. I,k,j, Index: Integer;  // Declaro la variable Index
  6. 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
  7. begin
  8. //declaro una variable que sirve para leer archivos de texto
  9.  
  10.   // creamos el componente
  11.   vFile:= TStringList.Create;
  12.   try
  13.     vFile.LoadFromFile('c:\tmp_ctaDeMov.txt');
  14.     for I := 0 to vFile.Count - 1 do
  15.     begin
  16.       //asigno una linea a cadena
  17.       cadena:= vFile.Strings[I];
  18. //length me arroja la cantidad de caracteres que tiene mi linea te texto
  19.       k:=Length(cadena);
  20.       Index := 0;  // Inicializamos Index
  21.       for j := 0 to k do
  22.       begin
  23. //con copy boy copiando caracter por caracter
  24.         cadena2:=Copy(cadena,j,1);
  25. // comparo si el caracter es igual a | si es asi que me lo muestre.
  26.         if cadena2='|' then
  27.         begin
  28.  
  29.           // ShowMessage(Registro);    {En vez de mostrarlo lo vamos a guardar en la variable Datos}
  30.           Datos[Index] := Registro;
  31.           Inc(Index);  //Incrementamos Index en 1
  32.           Registro:='';
  33.         end
  34. // si no boy armando mi texto que desarme ya separado por |
  35.         else
  36.         begin
  37.           Registro:=Registro + cadena2;
  38.  
  39.         end
  40.  
  41.       // Insertamos el primer registro   
  42.         with qryInsercion do
  43.   begin
  44.         Close;
  45.       SQL.Clear;
  46.       SQL.Add('INSERT INTO LATABLA (clave,nombre,folio,campoN) VALUES (:clave,:nombre,:folio,:campoN) ');
  47.       ParamByName('clave').AsString := Datos[0];
  48.       ParamByName('nombre').AsString := Datos[1];
  49.       ParamByName('folio,:').AsString := Datos[2];
  50.       ParamByName('campoN').AsString := Datos[3];
  51.       ExecSql;
  52.   end;
  53.       end;
  54.  
  55.     end;
  56.  
  57.  
  58.   finally
  59.     vFile.Free;//destruimos el componente
  60.   end;
  61.  
  62. end;




Espero haberte ayudado un poco. Cualquier cosa, aquí andamos (y)

Saludox ! :)

  • 0

#10 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 10 julio 2013 - 03:18

ayudará si nos muestras la estructura de tu tabla y que usas para conectarte a tu base de datos.
  • 0

#11 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 04:39

estoy utilizando componentes de conexion a la base como tadoconeccion, tadoquery,datasource,dataset
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 10 julio 2013 - 05:09

Lo que yo te he puesto no te ha servido amigo ???

Saludox ! :)
  • 0

#13 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 05:12

si amiga esta perfecto tienes razon ya tengo todo pero estoy utilizando para conectarme a la base de datos un tadoquery,
y un tadoconection, estonces cuando utilizo tu codigo el parabyname no me sale por lo contrario me marca error de otra forma ya llevo todo el dia sin encontrar la solucion y ya me atore un poquito.
  • 0

#14 tmsanchez

tmsanchez

    Advanced Member

  • Miembros
  • PipPipPip
  • 85 mensajes

Escrito 10 julio 2013 - 06:13

Hola.

Intenta:



delphi
  1. elNombreDelObjetoADOQuery.Parameters.ParamByName('NOMBRE_DEL_PARAMETRO').Value := EL_VALOR_DEL_PARAMETRO;



Saludos
  • 0

#15 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 10 julio 2013 - 06:25

asi esta mi codigo pero me marca un error en  adoquery en with en las propiedades ya ise mi conexion y probe la conexion me manda un mensaje que esta bien ahora no se que quiera



delphi
  1. with ADOQuery1 do
  2. begin
  3.   Close;
  4.   SQL.Clear;
  5.   SQL.Add('insert into ejemplo1(idsuc,id,nombre,tel)values(:idsuc,:id,:nombre,:tel)');
  6.   Parameters.ParamByName('idsuc').Value:=Datos[0];
  7.   Parameters.ParamByName('id').Value:=Datos[1];
  8.   Parameters.ParamByName('nombre').Value:=Datos[2];
  9.   Parameters.ParamByName('tel').Value:=Datos[3];
  10.   ExecSQL;
  11. end;


  • 0

#16 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 11 julio 2013 - 07:48

Amigo ags88

Tienes que calmarte un poco, jejeje, recuerda que no estamos sentados a un lado de tu computadora, así que cuando nos digas "me manda un error" tienes que decirnos qué error es el que te muestra, y si sigue siendo el mismo de que no te reconoce el ParamByName, entonces nuestro amigo tmsanchez ya te dió la respuesta a eso en su último comentario...  *-)

En la codificación siempre hay que ir tratando de resolver un problema a la vez, porque de repente con 1 pequeño errorcito desencadena una serie de problemas que parece que no tienen ni pies ni cabeza, así como te lo dije, tómalo con calma y vamos resolviendo punto por punto, verás que tu aplicación ya está casi terminada  (y)

Saludox ! :)


  • 0

#17 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 11 julio 2013 - 08:20

fenareth gracias por tu ayuda me muestra error en la parte de with adoqueri1
ya te mostre mi codigo de como lo tengo tal cual entonces ps ahi me quede. seguire buscando el error donde se encuentra y si tu lo encuentras te agradeceria muchisimo que tengas un buen dia, bendiciones.
  • 0

#18 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 11 julio 2013 - 08:32

fenareth gracias por tu ayuda me muestra error en la parte de with adoqueri1
ya te mostre mi codigo de como lo tengo tal cual entonces ps ahi me quede. seguire buscando el error donde se encuentra y si tu lo encuentras te agradeceria muchisimo que tengas un buen dia, bendiciones.


jeje, Fenareth te pregunta que es lo que dice el error amigo ags88 si no sabemos que error es, dificilmente se te podrá ayudar.

Saludos
  • 0

#19 ags88

ags88

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 11 julio 2013 - 09:12

buenos dias egostar lo que pasa es que tengo este codigo y cuando le doy correr al programa me marca error en la linea de codigo donde tengo

exactamente en esta linea me marca el error y no se porke si todo esta bien ya lo revice y ps todo marcha bien
with adoquery1 do

  • 0

#20 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 11 julio 2013 - 09:37

Jejejeje, creo que estamos atorados con lo del famoso error... ok, ya comprendí en donde te manda error, pero lo que no sé es qué error te manda.... cuando compilas, Delphi te manda errores (como Access Violation, como undeclared identifier, etc.) esos errores que manda nos ayuda para saber qué en tu código está mal y por donde puedes comenzar a buscar la corrección...

Nos dices: Le doy correr al programa y me marca error en la línea de código donde tengo el with adoquery1 do, lo que no nos dices exactamente el mensaje que manda el compilador de Delphi, porque cuando ejecutas, abre una ventanita donde dice [ERROR] y un mensaje despuecito, ese es el que queremos que nos transmitas  ;)

Espero que quede un poco más clara nuestra solicitud (y)

Saludox ! :)
  • 0




IP.Board spam blocked by CleanTalk.