GARANTIR DESCONTO

Fórum SEPARADO POR VIRGULA #167788

04/07/2003

0

Amigos,

gostaria de saber como faço para carregar um arquivo texto, lendo linha a linha, porem os campos estão separados por virgula.

consigo usar o READLN para ler a linha inteira e com o COPY divido a linha em campos, mas os campos nao estao nas mesmas colunas para todas as linhas.


obrigado

Ricardo


Datarit

Datarit

Responder

Posts

04/07/2003

Skywalker

Ola Tudo Bem

Bom , não sei se e a melhor solução, mas tenho uma ideia:

variavelstring:= seuarquivo;
for I:= 1 to length(variavelstring) do
begin
if variavelstring[I] = ´,´ then
//foi achada uma virgula começar o tratamento
else
//continuação caso nao encontre uma virgula
end;


Responder

Gostei + 0

04/07/2003

Jairroberto

Olá, Ricardo!

Você precisará ler a linha considerando uma string (campo) a cada vírgula encontrada. Para isso você pode ler um caractere de cada vez ou usar a função Pos para identificar a posição da próxima vírgula. Veja um exemplo:

var
  F: TextFile;
  s: string;   // conteúdo da linha
  Posicao, i: Integer;
  Campo: array[1..5] of string; // ajustar para a quantidade de campos
begin

  AssignFile(F, ´C:\NomeDoArquivo.txt´);
  Reset(F);
  try
    while not Eof(F) do
    begin
      ReadLn(F, s);

      i := 0;   

      repeat

        // incrementa o índice do campo lido
        Inc(i);

        // localiza a primeira vírgula existente na linha
        Posicao := Pos(´,´, s);

        
        if Posicao = 0 then // se não existe vírgula na linha
          Posicao := Length(s) + 1; // lê o resto da linha

        // armazena a parte da linha que corresponde ao campo
        Campo[i] := Copy(s, 1, Pred(Posicao));

        // elimina o campo lido da linha
        Delete(s, 1, Posicao);

      until Posicao >= Length(s);

      // ROTINA DE GRAVAÇÃO/EXIBIÇÃO DA INFORMAÇÃO OBTIDA DA LINHA
      ...
      ...

    end;
  finally
    CloseFile(F);
  end;

end;



Um abraço,
Jair
[/code]


Responder

Gostei + 0

04/07/2003

Jairroberto

Olá, Ricardo!

Você precisará ler a linha considerando uma string (campo) a cada vírgula encontrada. Para isso você pode ler um caractere de cada vez ou usar a função Pos para identificar a posição da próxima vírgula. Veja um exemplo:

var
  F: TextFile;
  s: string;   // conteúdo da linha
  Posicao, i: Integer;
  Campo: array[1..5] of string; // ajustar para a quantidade de campos
begin

  AssignFile(F, ´C:\NomeDoArquivo.txt´);
  Reset(F);
  try
    while not Eof(F) do
    begin
      ReadLn(F, s);

      i := 0;   

      repeat

        // incrementa o índice do campo lido
        Inc(i);

        // localiza a primeira vírgula existente na linha
        Posicao := Pos(´,´, s);

        
        if Posicao = 0 then // se não existe vírgula na linha
          Posicao := Length(s) + 1; // lê o resto da linha

        // armazena a parte da linha que corresponde ao campo
        Campo[i] := Copy(s, 1, Pred(Posicao));

        // elimina o campo lido da linha
        Delete(s, 1, Posicao);

      until Posicao >= Length(s);

      // ROTINA DE GRAVAÇÃO/EXIBIÇÃO DA INFORMAÇÃO OBTIDA DA LINHA
      ...
      ...

    end;
  finally
    CloseFile(F);
  end;

end;



Um abraço,
Jair


Responder

Gostei + 0

04/07/2003

4_olho

Ricardo,

continue lendo por Readln, pois até aí não tem jeito, mas depois, ao invés de usar COPY (que trabalha com strings de tamanho fixo) use :

var
registro : TStrings;

begin
registro := TStringList.Create;
try
registro.DelimitedText := ´sua linha´; // troque ´sua linha´ pelo que leu no Readln
registro.Delimiter := ´,´; // defina aqui o delimitador - a vírgula
finally
// ... aqui você trabalha seu registro, campo a campo registro[0], registro[1], etc....
registro.Free;
end;
end;


Responder

Gostei + 0

05/07/2003

Ruysalles

procedure TForm1.Button1Click(Sender: TObject);
Var FileName : String;
begin
FileName := ´c:\\windows\\desktop\\dados.txt´;
ADOConnection1.ConnectionString := ´Provider=Microsoft.Jet.OLEDB.4.0; Data Source=´+ExtractFilePath(FileName)+´; Extended Properties=´Text;HDR=Yes;FMT=Delimited´´;
ADOConnection1.LoginPrompt := False;
ADOConnection1.Open;

ADOTable1.Connection := ADOConnection1;
ADOTable1.TableName := ExtractFileName(FileName);
ADOTable1.Open;

ADOQuery1.Connection := ADOConnection1;
ADOQuery1.SQL.Text := ´SELECT * FROM ´+ExtractFileName(FileName);
ADOQuery1.Open;


end;


Um arquivo CSV é um arquivo texto com as informações separadas por ponto e virgula e as strings entre aspas duplas.

Se desejar uma personalização maior será necessário a criação do arquivo Schema.ini.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar