Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al importar fichero txt (https://www.clubdelphi.com/foros/showthread.php?t=85901)

jafera 16-06-2014 15:05:51

Buenas de nuevo.

Retomo el hilo para comentaros los avances, o no.

He creado el fichero mediante el uso de un IBSQL tal y como me recomendasteis, el resultado del proceso es un fichero txt exactamente igual que el creado mediante el proceso antiguo.

Al importar este fichero en el ejecutable hecho con XE5, sigue mostrando el error -303, si me llevo el txt tanto el creado mediante IBSQL como el anterior al ejecutable generado con Delphi 6, se importa perfectamente.

Yo creo que voy a dejar este proyecto congelado en Delphi 6 ya que no se que más mirar, ni si puedo poner un visor para ver donde se para exactamente ya que con el F8 se queda en la linea del BatchInput(F).

Código Delphi [-]
F_ModulDades.Act_Girona_Temp.Close;
F_ModulDades.Act_Girona_Temp.Open;
F_ModulDades.Act_Girona_Temp.Append;
F_Importa.IBSQLImporta.SQL.Text := 'Insert into RE0006AGTEMP values(:ID, :ID_REBUT, :ID_ARBITRE, :NOM, :DATA, :TITOL, :CODI_CLUB, :CANON, :ID_USUARI)';
F := TIBInputDelimitedFile.Create;
    try
          F.ColDelimiter := ';';
          if OpenDialog1.Execute then
          begin
                   F.Filename := OpenDialog1.FileName;
          end;
          F_Importa.IBSQLImporta.BatchInput(F);
finally
          F.Free;
end;

Lo único que se me ocurre es que si alguien quiere hacer un teamviewer conmigo pues estaré encantado de mostrar el proceso que me lleva de craneo y verlo "fallar" los dos a la vez.

Gracias a todos

Saludos

Josep

Nota esta es una de las lineas creadas con el proceso normal:

43;12;1;FERNANDEZ ALBERTI, Josep Antoni;22/08/2010;ESCALADA CASTELL BLANES;626;1.5;2

Solo me queda dudar de que interprete el espacio entre apellidos como final de linea........

duilioisola 16-06-2014 15:28:23

Por lo que entiendo, en este último mensaje, utilizas Delphi 6 para generar la exportación y Delphi XE5 para la importación.
Este podría ser el problema. A partir de Delphi 2009 (creo) se trabaja con Unicode. Deberías ver la posibilidad de crear la exportación con Delphi XE5 y ver si el fichero es igual al exportado con Delphi 6.
En un fichero de texto, los primeros bytes te dicen si en qué formato está. Mira BOM

jafera 16-06-2014 15:30:39

Gracias por la respuestas.

Igual no me he explicado bien, el fichero lo genero en XE5 y no lo importo en XE5 pero si en D6, que es lo que me tiene la mosca en la oreja.

Saludos

Josep

duilioisola 16-06-2014 15:47:29

Entonces sería al contrario... mira como se codifica el fichero que sale de Delphi XE5. Si lo miras byte a byte, podrás ver si tiene algo delante (BOM).
Por ejemplo, podría ser que el fichero empiece con EF BB BF si se tratara de UTF8 y que Delphi 6 los interpretaría como 3 caracteres que se deben procesar. Así, el primer campo de la importación sería "43" que daría un error de conversión si se espera un número.

Podrías preprocesar el fichero con algo así y generar un fichero temporal que luego importarás.
Código Delphi [-]
var
  Registro : string;
  Datos : TextFile;
[...]
           AssignFile(Datos,  OpenDialog1.FileName);
           Reset(Datos);
           CaracteresIgnorar := 0;
           try
              while not EOF(Datos) do
              begin
                 ReadLn(Datos, Registro);
                 {En la primera linea debo ver si es un archivo UTF y ver cuantos caracteres debo ignorar}
                 if (PrimeraLinea) then
                 begin
                    if (Ord(Registro[1]) = $EF) and (Ord(Registro[2]) = $BB) and (Ord(Registro[3]) = $BF) then {Posiblemente UTF8}
                       CaracteresIgnorar := 3;

                    Registro := copy(Registro,CaracteresIgnorar, Length(Registro));
                 end;
                 // Agrego Registro a un StringList
                 sl.Add(Registro);
              end; // while
              // Grabo el StringList a un fichero Temporal
              sl.SaveToFile(FicheroTemporal);

              // importo el fichero temporal
[...]

jafera 16-06-2014 15:49:27

Ok, pero como se mira un fichero txt para ver esta codificación?

He mirado el enlace que me has puesto y estoy más perdido que un pulpo en un garaje.

Saludos

Josep

jafera 16-06-2014 17:14:30

Y una duda que me queda para la prueba, "sl" como se declara?

Es una variable?

Josep

jafera 16-06-2014 17:54:49

Hechas las primeras pruebas, la primera linea empieza por......tachan..... , pero en el codigo puesto, lo he modificado así:

Código Delphi [-]
procedure TF_Importa.Button1Click(Sender: TObject);
var
  Registro : string;
  Datos, ficherotemporal : TextFile;
  caracteresignorar : integer;
  PrimeraLinea : Boolean;
  sl:tstringlist;
begin
           if opendialog1.Execute then
           begin
           AssignFile(Datos,  OpenDialog1.FileName);
           Reset(Datos);
           CaracteresIgnorar := 0;
           try
              while not EOF(Datos) do
              begin
                 ReadLn(Datos, Registro);
                 {En la primera linea debo ver si es un archivo UTF y ver cuantos caracteres debo ignorar}
                 if (PrimeraLinea) then
                 begin
                    if (Ord(Registro[1]) = $EF) and (Ord(Registro[2]) = $BB) and (Ord(Registro[3]) = $BF) then {Posiblemente UTF8}
                       CaracteresIgnorar := 3;
                    Registro := copy(Registro,CaracteresIgnorar, Length(Registro));
                 end;
                 // Agrego Registro a un StringList
                 sl.Add(Registro);
              end; // while
              // Grabo el StringList a un fichero Temporal
              sl.SaveToFile('C:\Rebuts_1.0\Fitxers\Ranking\FicheroTemporal.txt');
              finally
              // importo el fichero temporal
              end;
           end;
end;

ejecutando paso a paso , me dice que primeralinea := False, o sea que no pasa por el caracteresIgnorar y viendo que vale registro y siendo realmente la primera linea pues empieza por los caracteres descritos.

Algo sigo haciendo mal

Gracias

Josep

jafera 16-06-2014 18:23:18

Más avances.

Si codifico el txt como UTF8 (guardar como) es cuando detecta los caracteres iniciales.
Si lo codifico Annsi, no me reconoce caracteres al inicio y la linea (Registro) se ve correcta, pero el código no hace sl.Add, peta y da access violation

Codigo modificado:

Código Delphi [-]
begin
           if opendialog1.Execute then
           begin
           AssignFile(Datos,  OpenDialog1.FileName);
           Reset(Datos);
           CaracteresIgnorar := 0;
           PrimeraLinea:=True;
           sl:=TStringList.Create;  // faltaba esto
           try
              while not EOF(Datos) do
              begin
                 ReadLn(Datos, Registro);
                 {En la primera linea debo ver si es un archivo UTF y ver cuantos caracteres debo ignorar}
                 if (PrimeraLinea) then
                 begin
                    if (Ord(Registro[1]) = $EF) and (Ord(Registro[2]) = $BB) and (Ord(Registro[3]) = $BF) then {Posiblemente UTF8}
                       CaracteresIgnorar := 3;

                    Registro := copy(Registro,CaracteresIgnorar, Length(Registro));
                 end;
                 // Agrego Registro a un StringList
                 sl.Add(Registro);                     //Aqui acces violation.
                 next;
              end; // while
              // Grabo el StringList a un fichero Temporal
              sl.SaveToFile('C:\Rebuts_1.0\Fitxers\Ranking\FicheroTemporal.txt');
              finally
              // importo el fichero temporal
              end;
           end;
end;

No se si todo el código de pruebas esta correctamente realizado.
Esta variable sl se debe inicializar?
Por esto da access violation?

Saludos

Josep

jafera 14-07-2014 16:30:34

Buenas a todos los que seguis este hilo y a los nuevos curiosos pues también.

He tardado bastante en contestar a las modificaciones que he realizado desde el último post ya que no sabía como solucionar el problema, no era un defecto del txt, ya que esto pasaba en varios archivos de este tipo.

Al final, he implementado una solución utilizando el componente JvCsvDataSet al que le cargo el fichero txt generado y anda de maravilla.

No conocía este componente y realmente es potente y sencillo de usar aunque al principio el declarar los campos, las cabeceras etc., es un poco lioso hasta que se asimila bien.

Hoy por fin doy por finiquitado el problema ya que la importación se realiza sin problemas y sin usar tablas temporales intermedias.

Saludos

Josep


La franja horaria es GMT +2. Ahora son las 08:19:38.

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