Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problemas Lectura Archivo CSV (https://www.clubdelphi.com/foros/showthread.php?t=79843)

ASAPLTDA 15-08-2012 03:15:50

Problemas Lectura Archivo CSV
 
Apreciados Foristas,
He recibido un archivo de texto. El archivo es la exportacion de un sistema de SQLSERVER 2008 y los campos vienen delimitados con punto y coma (;)
Cuando los veo los con el editor de Notepad ++ se ven bien, cada registro tiene su registro final con CRLF indicando el final del registro , despues del ultimo registro no tiene campos de control visibles con notepad ++.
Para leer el archivo de datos utilizo el siguiente codigo utilizando delphi 5
Código:

  Readln(w_F, w_string);
  w_string := Trim(w_string)  ;
  While not (Eof(w_F)) OR (w_string  > '') do begin
    Inc(g_leidos);
    //LOAD_MEMO(W_STRING);
    LOAD_DATASET(W_STRING);
    w_string:='';
    Readln(w_F, w_string);
  end;
  CloseFile(w_F);

Pero no lee los registros , como si no los reconociera
Abri el Archivo con notepad++ copie los datos al clickboard y los copie a un notepad microsoft salve la informacion con otro nombre y ejecute de nuevo la lectura de datos, y ahi si funciono en forma correcta

Abri el archivo usando

Código Delphi [-]
  MemoCSV.Lines.Clear;  // PRUEBAS
  OpenDialog1.FileName:= '*.CSV';
  OpenDialog1.Execute;
  MemoCSV.Lines.LoadFromFile(OpenDialog1.FileName);

y como resultado obtengo solo 3 caracteres en el campo memo, pero son campos como de control

Ahora utilice el codigo usando delphi xe2
Código Delphi [-]
  MemoCSV.Lines.Clear;  // PRUEBAS
  OpenDialog1.FileName:= '*.CSV';
  OpenDialog1.Execute;
  MemoCSV.Lines.LoadFromFile(OpenDialog1.FileName);
y los datos aparecen en el campo memo en forma normal los cuales son comno 1500 registros

No uso delphi Xe2 ya que estamos apenas estamos migrando a esta nueva version de delphi

Puede alguno de ustedes darme alguno idea o si ha tenido el mismo problema y su solucion

Gracias

Adjunto una oparte del texto a importar
Cita:

RE;146 ;16208018-5 ;GOMEZ VELASQUEZ RAMIRO ;2012-06-21 00:00:00.000;CRA 9 # 9-17 ;(052 ) 211 38 38 ;CARTAGO ;VALLE ;11:20;455019515110 ;195/60 R15 88H KR10 ;BOD6
;2.0000000;1;

roman 15-08-2012 17:32:23

Me pierdo en la descripción de tu problema. ¿Qué es el primer código? ¿Qué es eso de LOAD_MEMO, LOAD_DATASET? ¿Quieres leer el archivo con ese código (que no entiendo qué hace) o en un Memo con LoadFromFile?

// Saludos

ASAPLTDA 16-08-2012 03:25:55

Ampliacion Codigo
 
Gracias Roman por contestar:

El primer codigo es para ller el archivo que voy a importar y declaro un archivo texto, el cual leo linea a linea, una vez que leo una linea lo que hago es descomponer el registro en campos.

Código Delphi [-]
procedure forma1.leer_texto;
var
  w_F          :TextFile;
  w_string     :string   ;
begin
 Readln(w_F, w_string);
  w_string := Trim(w_string)  ;
  While not (Eof(w_F)) OR (w_string  > '') do begin
    descomponer_texto_en_campos(); 
   w_string:='';
    Readln(w_F, w_string);
  end;
  CloseFile(w_F);

Con el anterior el programa no lee registros ya que el while esta condicionado con eof(w_f) , tal como lo anote en la descripcion si el archivo lo copio a otro archivo usando copy parte y salvarlo el archivo si es procesado en forma normal

En el siguiente formato, uno puede grabar la inormacion de un archivo de texto dentro de un campo memo. La prueba conv delhi 5 solo trae 3 caracteres que no se que son, usando delphi xe2 con el mimo codigo si funciona,

Código Delphi [-]
 MemoCSV.Lines.Clear;  // componente tipo memo en la forma
  OpenDialog1.FileName:= '*.CSV';
  OpenDialog1.Execute;
  MemoCSV.Lines.LoadFromFile(OpenDialog1.FileName);  // grabar a un campo memo toda la informacion del archivo a importar

Creo que existe algo en el archivo que no deja que se lea normalmente, pero a su vez existe alguna diferencia en la forma que se lee un load fromfile entre delphi 5 y delphi xe

Gracias por su atencion

Casimiro Noteví 16-08-2012 09:16:53

No entiendo la explicación, ¿quieres decir que el fichero de texto tiene un formato especial?, ¿que no es texto 'normal'?

¿Es posible que pongas aquí un trozo de fichero para que le echemos un vistazo?

ASAPLTDA 16-08-2012 16:29:59

archivo csv
 
Cita:

Empezado por Casimiro Notevi (Mensaje 439731)
No entiendo la explicación, ¿quieres decir que el fichero de texto tiene un formato especial?, ¿que no es texto 'normal'?

¿Es posible que pongas aquí un trozo de fichero para que le echemos un vistazo?

Gracias casimiro por tu interes, Voy a envia el archivo original y el archivo copia usando el clipboard para que puedan observar alguna difrencia que no he podido hallar.
El archivo que tiene las letras xxxx al final es la copia usando el copy a clipboard

Usdo delphi 5

roman 16-08-2012 17:12:42

El archivo original está en unicode que no puede leer delphi 5 directamente pero sí delphi xe. Tendrías que convertir primero el archivo antes de poder leerlo.

// Saludos

roman 16-08-2012 17:55:26

Me encontré esta función aquí, al parecer de Peter Below

Código Delphi [-]
procedure LoadUnicodeFile(const FileName: String; Strings: TStrings);
  procedure SwapWideChars(p: PWideChar);
  begin
    while p^ <> #0000 do
    begin
      p^ := WideChar(Swap(Word(p^)));
      Inc( p );
    end;
  end;

var
  Stream: TMemoryStream;
  wChar: WideChar;
  pwChar: PWideChar;

begin
  Stream:= TMemoryStream.Create;

  try
    Stream.LoadFromFile(FileName);
    Stream.Seek(0, soFromEnd);
    wChar := #0000;
    Stream.Write(wChar, SizeOf(wChar));

    pwChar := Stream.Memory;
    if pwChar^ = #$FEFF then // normal byte order mark
      Inc(pwChar)
    else if pwChar^ = #$FFFE then
    begin // byte order is big-endian
      SwapWideChars(pwChar);
      Inc(pwChar);
    end
    else; // no byte order mark

    Strings.Text := WideChartoString(pwChar);
  finally
    Stream.free;
  end;
end;

Su uso es muy sencillo:

Código Delphi [-]
LoadUnicodeFile('c:\ruta\a\PLANO_WMS3.TXT', Memo1.Lines);

Ojalá te sirva.

// Saludos

Casimiro Noteví 16-08-2012 19:23:05

Me lo guardo, puede hacer falta :)

ecfisa 16-08-2012 20:09:15

Hola.

Para sumar otra opción: Delphi Gems Unicode library, free (licencia MIT) para plataformas Delphi 4 - 5, BCB 4 - 5.

Saludos.

roman 16-08-2012 20:12:42

A decir verdad, esa biblioteca fue lo primero que encontré e incluso la descargué. Pero soy muy flojo :o y de buenas a primeras no vi cómo usarla para resolver el problema del compañero, así que seguí con mi búsqueda en Google :D.

// Saludos

ASAPLTDA 17-08-2012 00:03:26

Como se Identifica el Archivo tenga caracteres Unicode?
 
Cita:

Empezado por roman (Mensaje 439751)
El archivo original está en unicode que no puede leer delphi 5 directamente pero sí delphi xe. Tendrías que convertir primero el archivo antes de poder leerlo.

Gracias Roman, al identificar que el archivo venia con caracteres unicode, varios foristas enviaron soluciones para poder leer los datos con delphi 5. Copie la intruccion del fuente de Peter Below enviado por nuestro companero, no entiendo :confused: como lo hace pero lo hace (
Toca estudiar mas delphi :eek:)

roman como identifico que venia con caractrres unicode ?

ASAPLTDA 17-08-2012 00:06:41

Leyendo archivo con caractres unicode con delphi 5
 
Gracias Forista Roman y a los otros foristas por su pronta respuesta
Usando el codigo de Peter Below facilitado por roman he podidom solucionar el problema con un par de copy paste :D

[quote=roman;439752]Me encontré esta función aquí, al parecer de Peter Below

Casimiro Noteví 17-08-2012 00:20:12

Cita:

Empezado por ASAPLTDA (Mensaje 439782)
roman como identifico que venia con caractrres unicode ?

Fíjate en la diferencia, en el "normal" hay un espacio por cada caracter. En el unicode, que tiene más de un byte por caracter como puedes ver:




roman 17-08-2012 06:00:06

Cita:

Empezado por ASAPLTDA (Mensaje 439782)
roman como identifico que venia con caractrres unicode ?

Ya Casimiro dió la respuesta correcta y científica :) Yo me limité a abrir el archivo con EditPlus y en la esquina inferior derecha claramente decía: Unicode :D



Ya dije que soy muy flojo :o :p

// Saludos

Casimiro Noteví 17-08-2012 09:13:24

Cita:

Empezado por roman (Mensaje 439797)
Ya dije que soy muy flojo :o :p

Son las cosas de la edad :p:D


A mi me pasa igual :o:)


La franja horaria es GMT +2. Ahora son las 14:38:46.

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