Ler Arquivo txt pelo Delphi

Delphi

13/08/2009

Olá pessoal, estou precisando ler um arquivo texto em Delphi, e identificar a separação de campos que está feita com ( tab ) e final de linha com ( enter ).

Obs. Este é o Código que estou usando:
...
AssignFile(f, edtArquivo.Text);
Reset(f);
While not Eof(f) do
begin
Readln(f, sLinha);
FieldByName(´CAMPO1´).AsString := Copy( sLinha, 1,8);
FieldByName(´CAMPO2´).AsString := Copy( sLinha, 9,40);
end;

Então, o poblema é que o arquivo não está com os blocos alinhados de cada campo e sim separados como indicado acima.

alguém, poderia dar alguma dica de como fazer isso?

Obrigado,

José Aparecido


Jose Aparecido

Jose Aparecido

Curtidas 0

Respostas

Alanporto

Alanporto

13/08/2009

tenta carregar num TRichEdit primeiro, aí vc pode pegar o texto sem formatação (PlainText = True).

Acredito que sem formatação funcionaria.


GOSTEI 0
Jose Aparecido

Jose Aparecido

13/08/2009

Olá Alan, obrigado pelo retorno, deu um pouco de trabalho, mas consegui a solução procurada desta forma abaixo citada, resolvi deixar este post porque pode ser útil para outra pessoa...

...//Definicoes Anteriores
iI := 0;
iPosAtu := 0;
try
try
AssignFile(f, edtArquivo.Text);
Reset(f);
atLista.Open;
While not Eof(f) do
begin
Readln(f, sLinha);

if iI > 1 then
begin
iCont := 0;

while sLinha <> ´´ do
begin
iCont := iCont + 1;
iPosAtu := Pos( #9, sLinha );

if iPosAtu <> 0 then
begin
if iCont = 1 then
sFone := Copy(sLinha, 1, iPosAtu-1)
else if iCont = 2 then
sNome := Copy(sLinha, 1, iPosAtu-1)
else if iCont = 3 then
sEndereco := Copy(sLinha, 1, iPosAtu-2)
else if iCont = 4 then
sBairro := Copy(sLinha, 1, iPosAtu-1)
else if iCont = 5 then
sCidade := Copy(sLinha, 1, iPosAtu-1)
else if iCont = 6 then
sUF := Copy(sLinha, 1, iPosAtu-1)
else if iCont = 7 then
sCEP := Copy(sLinha, 1, iPosAtu-1);

Delete( sLinha, 1, iPosAtu);
end else
sLinha := ´´;
end;

...//Continua Rotina

Obs.: Poderia trabalhar com uma única variável, e usar o copy, mas ficuou um pouco trabalhoso pra formatar, assim ficou mais facil, a partir das variáveis carregadas, posso atualizar qualque BD...

Valeu, obrigado

José Aparecido


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

13/08/2009

veja se este exemplo te ajuda em algo:
procedure TForm8.Button3Click(Sender: TObject);
var
  f: textfile;
  slinha, stexto: string;
  sl: TStringList;
  i, l: integer;
begin
  AssignFile(f, edtArquivo.Text);
  Reset(f);

  sl := TStringList.Create;
  l := 0;

  while not Eof(f) do
  begin
    Readln(f, sLinha);
    inc(l);

    sl.Clear;
    // desmembra a linha, "gerando" as colunas
    while slinha <> ´´ do
    begin
      i := pos(#9, slinha);
      if i > 0 then
      begin
        sl.Add(copy(slinha, 1, i-1));
        slinha := copy(slinha, i+1, length(slinha));
      end
      else
      begin
        sl.Add(slinha);
        slinha := ´´;
      end;
    end;

    // monta o texto a ser exibido
    stexto := ´registro ´+inttostr(l)+1313;
    for i := 0 to sl.Count-1 do
      stexto := stexto + ´coluna: ´+inttostr(i+1)+´   conteúdo: ´+sl[i]+13;

    showmessage(stexto);
  end;
end;


note que o desmembramento poderia ser feito com a propriedade DelimitedText em conjunto com a propriedade QuoteChar e Delimiter da stringlist, porém dessa forma, nas colunas em que o conteudo tenha espaços em brancos, estes DEVERÃO estar entre aspas, caso contrário, cada espaço será considerado um separador. para ilustrar:
12[TAB]TESTE DE CAMPO[TAB]VALOR 1[ENTER] resulta em:
12
TESTE
DE
CAMPO
VALOR
1

12[TAB]´TESTE DE CAMPO´[TAB]´VALOR 1´[ENTER] (conteúdo entre aspas) resulta em:
12
TESTE DE CAMPO
VALOR 1

então, se o conteúdo da coluna - no caso de haver espaços - já estiver entre aspas, use apenas:

procedure TForm8.Button3Click(Sender: TObject);
var
  f: textfile;
  slinha, stexto: string;
  sl: TStringList;
  i, l: integer;
begin
  AssignFile(f, edtArquivo.Text);
  Reset(f);

  sl := TStringList.Create;
  sl.Delimiter := #9; // [tab]
  sl.QuoteChar := 39 // 34 para aspas duplas, 39 para aspas simples
  l := 0;

  while not Eof(f) do
  begin
    Readln(f, sLinha);
    inc(l);

    sl.DelimitedText := sLinha;

    // monta o texto a ser exibido
    stexto := ´registro ´+inttostr(l)+1313;
    for i := 0 to sl.Count-1 do
      stexto := stexto + ´coluna: ´+inttostr(i+1)+´   conteúdo: ´+sl[i]+13;

    showmessage(stexto);
  end;
end;



GOSTEI 0
Jose Aparecido

Jose Aparecido

13/08/2009

Oi Emerson, conseguimos montar o quebra-cabeça por aqui, ficou um pouco diferente, mas funcionou, num dos testes que foi feito, usamos a lógica que você passou.

Muito obrigado,

José Aparecido


GOSTEI 0
POSTAR