RES: RES: RES: [delphi-br] Importação de Arquivo

2010-07-14 Por tôpico Ralp Alves Bezerra
Desculpe pessoal é porque eu realmente nunca importei um arquivo de texto
com esta estrutura.

Seguindo a dica do Rubem, consegui esta procedure para tratar o arquivo
antes da importação:

procedure  FileReplaceString( const FileName, searchstring, replacestring:
string  );
var
fs: TFileStream;
S: string ;
begin
  fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
  try
SetLength(S, fs.Size);
fs.ReadBuffer(S[1], fs.Size);
  finally
fs.Free;
  end ;
S  := StringReplace(S, SearchString, replaceString, [rfReplaceAll,
rfIgnoreCase]);
fs := TFileStream.Create(FileName, fmCreate);
  try
fs.WriteBuffer(S[1], Length(S));
  finally
fs.Free;
  end ;

Estou utilizando da seguinte maneira:

StringReplace(Entrada, ','  ,  ';'  , [rfReplaceAll] );
StringReplace(Entrada, ','  ,  ';'  , [rfReplaceAll] );
StringReplace(Entrada, ','  ,  ';'  , [rfReplaceAll] );

Funcionou parcialmente. O problema agora é com os campos do tipo float que
não estão entre aspas duplas. Eles continuam com a vírgula na delimitação.

E se eu substituir as vírgulas por ponto e vírgula, a vírgula do histórico
também muda. Ai gera o problema.

;0254;Atender as necessidades das Escolas deste Municipio, conforme Termo de
Contrato no 021/2010.;2295.32,787.00,1508.32,

Abraço.

-Mensagem original-
De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em
nome de Rubem Nascimento da Rocha
Enviada em: quarta-feira, 14 de julho de 2010 11:57
Para: delphi-br
Assunto: RE: RES: RES: [delphi-br] Importação de Arquivo
Prioridade: Alta


Mas se for prestar bem atenção ao formato do texto, basta remover as
seguintes sequencias de caracteres por ponto-e-vírgula:

 

1) ',';

2) ',';

3) ','

 

Isso não impacta, por exemplo, no conteúdo de um campo literal(string) como
o que vc ilustrou. Pensei q isto estivesse claro!

 

Sds.
 


To: delphi-br@yahoogrupos.com.br
From: ral...@gmail.com
Date: Wed, 14 Jul 2010 11:54:06 -0300
Subject: RES: RES: [delphi-br] Importação de Arquivo

  



O que ocorre é o seguinte:

Neste arquivo texto contém um campo histórico da seguinte forma. exemplo:
“Pagamento efetuado em 25/14, visto que houve atraso.” 

Note que existe uma vírgula dentro do histórico.

Retirar as aspas duplas é beleza, porém, se for substituir as vírgulas por
ponto e vírgula, a vírgula contida dentro do campo histórico também será
substituída por ponto e vírgula. (é vírgula demais!)

Neste caso, pode ser interpretada como novo campo.

Será que existe alguma maneira de antes de eliminar as aspas duplas e
substituir as vírgulas por ponto e vírgula, efetuar uma pesquisa em tudo que
se encontra dentro das aspas duplas e se for encontrada alguma vírgula a
mesma ser eliminada?

Abraço.

De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em
nome de Rubem Rocha Enviada em: quarta-feira, 14 de julho de 2010 11:03
Para: delphi-br@yahoogrupos.com.br
Assunto: RES: RES: [delphi-br] Importação de Arquivo
Prioridade: Alta

Ora, o StringReplace vai retirar as aspas onde apenas haverão aspas, e o
separador será ponto-e-vírgula. Não vejo problema nenhum nisso.

Sds.

De: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
[mailto:delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
] Em nome de Walter Chagas (Bol) Enviada em: quarta-feira, 14 de julho de
2010 08:00
Para: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
Assunto: Re: RES: [delphi-br] Importação de Arquivo

Ruben, torno a questionar.

E se tiver dois valores float na sequencia? Lembre-se que os valores float
não vem entre aspas.

[]s

Walter Alves Chagas Junior
Belo Horizonte - MG - Brazil
wchag...@bol.com.br mailto:wchagasj%40bol.com.br
mailto:wchagasj%40bol.com.br http://delphitocorporerm.blogspot.com/
http://twitter.com/wchagas
MSN: whitesock...@hotmail.com mailto:whitesockets%40hotmail.com
mailto:whitesockets%40hotmail.com
SKYPE: WalterChagasJr

- Original Message -
From: Rubem Rocha
To: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
mailto:delphi-br%40yahoogrupos.com.br
Sent: Tuesday, July 13, 2010 6:14 PM
Subject: RES: RES: [delphi-br] Importação de Arquivo

Simples! Faz um StringReplace() na linha lida fazendo as seguintes trocas:

1) De [,”] para [;]

2) De [“,] para [;]

3) De [“,”] para [;]

Assim, a linha lida terá os valores dos campos delimitados por
ponto-e-vírgula! Bem mais fácil pra ler, não?

Sds.

De: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
mailto:delphi-br%40yahoogrupos.com.br [mailto:delphi-br@yahoogrupos.com.br
mailto:delphi-br%40yahoogrupos.com.br
mailto:delphi-br%40yahoogrupos.com.br ] Em nome de Walter Chagas (Bol)
Enviada em: terça-feira, 13 de julho de 2010 17:06
Para: delphi-br@yahoogrupos.com.br mailto:delphi-br%40yahoogrupos.com.br
mailto:delphi-br%40yahoogrupos.com.br
Assunto: Re: RES: [delphi-br] Importação de Arquivo

Não não não não.

Da forma como você está propondo, voce supoe que entre os 

Res: RES: RES: RES: [delphi-br] Importação de Arquivo

2010-07-14 Por tôpico Jean Barreiros
você nao viu a solução que eu mandei ontem?

=

segue a forma de você resolver: 
(
Eu coloquei um ClientDatSet no form e criei 15 Fields chamdos: 
campo1...2..3..4..15 como string
e campo16 como Float, os tamanhos são de acordo a cada campo do txt
)

procedure TForm1.Button1Click(Sender: TObject);
var arq: TextFile; linha:string;
begin
ClientDataSet1.CreateDataSet;
AssignFile(arq,'dados.txt');
Reset(arq);
while not Eof(arq) do
begin
ClientDataSet1.Append;
ReadLn(arq,linha);//Ler os dados da linha;
linha := StringReplace(linha,',',';',[rfReplaceAll]);
linha := StringReplace(linha,'','',[rfReplaceAll]);
//Delete(linha,1,1);//apaga a 1ª aspas duplas;
ClientDataSet1.Fields[0].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[1].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[2].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[3].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[4].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[5].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[6].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[7].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[8].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[9].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[10].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[11].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[12].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[13].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
ClientDataSet1.Fields[14].AsString := Copy(linha,1,Pos(';',linha)-1);
Delete(linha,1,Pos(';',linha));
linha := StringReplace(linha,'.','',[rfReplaceAll]);//Transforma os '.' em 
',' para separar a casa de milar;
linha := StringReplace(linha,';',',',[rfReplaceAll]);//Transforma os ';' em 
'.' para separar a casa decimal;
ClientDataSet1.Fields[15].AsFloat := 
StrToFloat(linha);//FormatFloat('###,###,#0.00',StrToFloat(linha));
ClientDataSet1.Post;
end;
end;

espero ter ajudado.




 ===
Jean Barreiros
  Programador/Web-Designer
  Delphi|C++|PHP|JavaScript
  FireBird|MySql|SQLServer
  PostGree|Oracle
  msn: delphij...@gmail.com
  e-mail: delphij...@yahoo.com.br
===





De: Ralp Alves Bezerra ral...@gmail.com
Para: delphi-br@yahoogrupos.com.br
Enviadas: Quarta-feira, 14 de Julho de 2010 12:45:15
Assunto: RES: RES: RES: [delphi-br] Importação de Arquivo

  
Desculpe pessoal é porque eu realmente nunca importei um arquivo de texto
com esta estrutura.

Seguindo a dica do Rubem, consegui esta procedure para tratar o arquivo
antes da importação:

procedure  FileReplaceString( const FileName, searchstring, replacestring:
string  );
var
fs: TFileStream;
S: string ;
begin
fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
try
SetLength(S, fs.Size);
fs.ReadBuffer(S[1], fs.Size);
finally
fs.Free;
end ;
S  := StringReplace(S, SearchString, replaceString, [rfReplaceAll,
rfIgnoreCase]);
fs := TFileStream.Create(FileName, fmCreate);
try
fs.WriteBuffer(S[1], Length(S));
finally
fs.Free;
end ;

Estou utilizando da seguinte maneira:

StringReplace(Entrada, ','  ,  ';'  , [rfReplaceAll] );
StringReplace(Entrada, ','  ,  ';'  , [rfReplaceAll] );
StringReplace(Entrada, ','  ,  ';'  , [rfReplaceAll] );

Funcionou parcialmente. O problema agora é com os campos do tipo float que
não estão entre aspas duplas. Eles continuam com a vírgula na delimitação.

E se eu substituir as vírgulas por ponto e vírgula, a vírgula do histórico
também muda. Ai gera o problema.

;0254;Atender as necessidades das Escolas deste Municipio, conforme Termo de
Contrato no 021/2010.;2295.32,787.00,1508.32,

Abraço.

-Mensagem original-
De: delphi-br@yahoogrupos.com.br [mailto:delphi...@yahoogrupos.com.br] Em
nome de Rubem Nascimento da Rocha
Enviada em: quarta-feira, 14 de julho de 2010 11:57
Para: delphi-br
Assunto: RE: RES: RES: [delphi-br] Importação de Arquivo
Prioridade: Alta

Mas se for prestar bem atenção ao formato do texto, basta remover as
seguintes sequencias de caracteres por ponto-e-vírgula:

1) ',';

2) ',';

3) ','

Isso não impacta, por exemplo, no conteúdo de um campo literal(string) como
o que vc ilustrou. Pensei q isto estivesse claro!

Sds.


To: delphi-br@yahoogrupos.com.br
From: ral...@gmail.com
Date: Wed, 14 Jul 2010 11:54:06 -0300
Subject: RES: RES