PDA

Ver la Versión Completa : Cargar archivo delimitado


mRoman
20-10-2011, 21:17:17
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:

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
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||203 24742|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||2032 4743|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:


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:

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 (http://www.clubdelphi.com/foros/showthread.php?t=75885), donde hay maneras alternativas de realizarlo.

Un saludo.

mRoman
20-10-2011, 22:29:28
Hola.

La función ExtractStrings, delimita el texto correctamente.

Ejemplo:

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 (http://www.clubdelphi.com/foros/showthread.php?t=75885), 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
Listo....ya probé tu solución y funciono a la perfeccion....

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

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 !!!