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: [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
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