Fórum SEPARADO POR VIRGULA #167788
04/07/2003
0
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
Curtir tópico
+ 0Posts
04/07/2003
Skywalker
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;
Gostei + 0
04/07/2003
Jairroberto
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]
Gostei + 0
04/07/2003
Jairroberto
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
Gostei + 0
04/07/2003
4_olho
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;
Gostei + 0
05/07/2003
Ruysalles
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)