Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cargar archivo delimitado (https://www.clubdelphi.com/foros/showthread.php?t=76280)

mRoman 20-10-2011 21:17:17

Cargar archivo delimitado
 
Hola amigos, como están?

Nuevamente pidiendo su apoyo para resolver un problema q tengo. Les explico:

Tengo una archivo de tipo texto que esta delimitado por el simbolo pipe "|" y lo estoy cargando a un StringList y despues a un StringGrid, pero como que no me respeta el pipe cuando encuentra un espacio en blanco. Dentro del archivo esta algo como esto:

Código:

0000000002|002268176A|05/09/2011|225|18|1820002400||19|1|||||||||SALDAÑA|LUEVANO|SANDRA LUZ|OBREGON|439 |0 |TABASCO|PORTES GIL|BEIS|63200||CERCA DEL KINDER|18|18|1||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1|1|1|24|07:15|19||20324739|SI
0000000002|002268176A|05/09/2011|225|18|1820002500||41|1|||||||||MAGAÑA|MERAZ|TANNIA|FRANCISCO SARABIA|125 |0 |CORONA|SIMON SANCHEZ|BEIS|63200||ABARROTES AGREDANO|18|18|1||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1|2|2|17|07:45|41||20324742|SI
0000000005|002268176A|05/09/2011|225|18|1820002500||42|1|||||||||VALENZUELA|GARCIA|PETRA|SIMON SANCHEZ|603 |0 |JUSTO SIERRA|FRANCISCO SARABIA|BEIS|63200||MERCADITO SIMON SANCHEZ|18|18|1||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1|2|2|17|07:45|42||20324743|SI

Dentro de la primer linea de texto esta la cadena de "|SANDRA LUZ|", esto delphi me lo carga en el StringGrid en columnas diferentes cuando lo mas lògico seria q lo cargue en una sola columna. He configurado las propiedas Delimiter y DelimitedText de ambos objetos (StringList y StringGrid) con el simbolo pipe.

Les paso el código completo de mi programa:

Código Delphi [-]
unit STRGList;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids, DB, DBTables;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    odAbrir: TOpenDialog;
    edNFichero: TEdit;
    lbCadenas: TListBox;
    sgCadenas: TStringGrid;
    Edit1: TEdit;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    procedure RellenarLB();
    procedure RellenarSG();
  public
    { Public declarations }
    SL : TStringList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
  nCol:Integer;
begin

  EdNFichero.Text := '';
  for nCol:=0 to SGCadenas.ColCount-1 do
  begin
//        SGCadenas.Cells[nCol,0] := 'Campo'+IntToStr(nCol);
  end;

  SL := TStringList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    SL.Free;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
VAR
  NombreFichero: String;
begin
  IF ODAbrir.Execute THEN
  BEGIN
    NombreFichero := ODAbrir.FileName;
    IF NOT(FileExists(NombreFichero)) THEN
      ShowMessage('No se puede cargar el archivo ' + NombreFichero)
    ELSE
    BEGIN
//      SL.DelimitedText:='|';
      SL.Delimiter:='|';
      SL.DelimitedText:='|';
      SL.LoadfromFile(NombreFichero);
      EdNFichero.Text := NombreFichero;
      ShowMessage(SL.DelimitedText);
      RellenarLB;
      RellenarSG;
    END;
  END;
  SGCadenas.RowCount:=LBCadenas.Count;

end;

procedure tForm1.RellenarLB;
VAR
  i: Integer;
BEGIN
  LBCadenas.Clear;
  FOR i := 0 TO SL.Count - 1 DO
  begin
    LBCadenas.Items.Add(SL.Strings[i]);
  end;
END;

procedure tForm1.RellenarSG;
VAR
  i: Integer;
  PosIni,PosFin,Lin,Col: Integer;

  NombreParametro: String;
BEGIN

      FOR i := 0 TO SL.Count - 1 DO
      BEGIN

          SGCadenas.Rows[i].Delimiter:='|';
          SGCAdenas.Rows[i].DelimitedText:=SL.Strings[i];

      END;
END;
end.

Que me hace falta para que se cargue bien las cadenas q contienen espacios en blanco en una sola columna de mi StringGrid. He visto opciones con ADO, pero requiere de hacer cambios al regedit y no quiero irme hasta alla ya que es algo mas laborioso para el usuario final, en otras palabras le tengo q explicar como hacerlo ya que no estaré ahi para hacerlo yo, entonces no es opción.

Espero me puedan ayudar.

TRABAJO CON DELPHI 6.

Saludos !!!

ecfisa 20-10-2011 21:49:59

Hola.

La función ExtractStrings, delimita el texto correctamente.

Ejemplo:
Código Delphi [-]
var
  st: string;
begin
  st:='0000000002|002268176A|05/09/2011|225|18|1820002400||19|1|||||||||SALDAÑA|LUEVANO|SANDRA LUZ|OBREGON|439 |0 |TABASCO|PORTES GIL|BEIS|63200||CERCA DEL KINDER|18|18|1||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1|1|1|24|07:15|19||20324  739|SI';
  ExtractStrings(['|'], [' '], PChar(st), StringGrid1.Rows[0]);
end;
Pero no sé si Delphi 6 la incluye. De no estar, revisá este hilo, donde hay maneras alternativas de realizarlo.

Un saludo.

mRoman 20-10-2011 22:29:28

Cita:

Empezado por ecfisa (Mensaje 416346)
Hola.

La función ExtractStrings, delimita el texto correctamente.

Ejemplo:
Código Delphi [-]
var
  st: string;
begin
  st:='0000000002|002268176A|05/09/2011|225|18|1820002400||19|1|||||||||SALDAÑA|LUEVANO|SANDRA LUZ|OBREGON|439 |0 |TABASCO|PORTES GIL|BEIS|63200||CERCA DEL KINDER|18|18|1||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1|1|1|24|07:15|19||20324  739|SI';
  ExtractStrings(['|'], [' '], PChar(st), StringGrid1.Rows[0]);
end;
Pero no sé si Delphi 6 la incluye. De no estar, revisá este hilo, donde hay maneras alternativas de realizarlo.

Un saludo.

Gracias por la respuesta tan rápida. Te agradezco. Ya revisé en Delphi6 y si incluye la funcion...la probaré y les cuento luego como me fué.

mRoman 20-10-2011 22:39:32

Archivo delimitado por pipes SOLUCIONADO
 
Listo....ya probé tu solución y funciono a la perfeccion....

les paso el código donde hice la corrección.

Código Delphi [-]
procedure tForm1.RellenarSG;
VAR
  i: Integer;
  PosIni,PosFin,Lin,Col: Integer;

  NombreParametro: String;
BEGIN

      FOR i := 0 TO SL.Count - 1 DO
      BEGIN

          SGCadenas.Rows[i].Delimiter:='|';
//          SGCAdenas.Rows[i].DelimitedText:=SL.Strings[i];
         
          ExtractStrings(['|'],[' '],Pchar(SL.Strings[i]), SGCadenas.Rows[i]);
      END;
END;

Solo agrgue la linea q esta en azul y listo !!!...funciono...GRACIAS !!!


La franja horaria es GMT +2. Ahora son las 14:06:53.

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