Ler Arquivo txt pelo Delphi
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
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
Curtidas 0
Respostas
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.
Acredito que sem formatação funcionaria.
GOSTEI 0
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
...//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
13/08/2009
veja se este exemplo te ajuda em algo:
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; 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
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
Muito obrigado,
José Aparecido
GOSTEI 0