Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
DiogoDF83 Novato
Registrado: Sexta-Feira, 19 de Novembro de 2021 Mensagens: 20
|
Enviada: Sex Jan 21, 2022 9:53 am Assunto: [Resolvido]de CSV para dbGrid |
|
|
Bom dia pessoal.
preciso ler um arquivo csv e inserir num brGrid.
csv vem ex:
12345;1,48;
54321;9,50;
87654;2,10;
tenho que inserir num dbgrid
NUMERO| VALOR
12345........1,48
e assim por diante
No dbGrid uso Um dataSource = GridCartoes.
Código: |
var
Arquivo: TTextFile;
TipoRegistro: TTextFileRecordType;
begin
Arquivo := TTextFile.Create(nil);
// cria o layout do arquivo
Arquivo.FileName := aNomeArquivo;
Arquivo.FileType := ftDelimitedFields;
Arquivo.FieldsDelimiter := ';';
Arquivo.DecimalDelimiter := ',';
Arquivo.ValidateRecordLayout := False;
Arquivo.RecordTypes.Add;
Arquivo.Open(False);
try
while not Arquivo.EndOfFile do
begin
Arquivo.Next;
end;
except
on E:Exception do
raise Exception.Create('Erro na importação');
end;
|
Desde já agradeço
Editado pela última vez por DiogoDF83 em Ter Jan 25, 2022 8:45 am, num total de 1 vez |
|
Voltar ao Topo |
|
|
netoferreira Novato
Registrado: Sexta-Feira, 19 de Dezembro de 2014 Mensagens: 77 Localização: Macapá - AP
|
Enviada: Sex Jan 21, 2022 11:18 am Assunto: |
|
|
Bom dia, Diogo
Vou mandar o código que uso em uma aplicação aqui, creio que possa te ajudar.
Código: |
var
csv : TextFile;
quebra : TStringList;
arq : string;
contador : Integer;
ticket,pnome,pcategoria,psexo,pfaixa,ppeso,pequipe : string;
begin
quebra := TStringList.Create;
AssignFile(csv,caminho_arquivo_csv);
Reset(csv);
contador := 1;
while not Eoln(csv) do
begin
quebra.Clear;
Readln(csv,arq);
ExtractStrings([','],[],pchar(arq),quebra);
if Contador = 1 then // Primeira Linha do arquivo (Cabeçalho);
begin
contador := contador + 1;
end
else
begin
ticket := RemoveAllChars(quebra.Strings[0],'"');
pnome := AnsiUpperCase(RemoveAllChars(UTF8ToWideString(quebra.Strings[1]),'"'));
pequipe := RemoveAllChars(UTF8ToWideString(quebra.Strings[2]),'"');
pcategoria := RemoveAllChars(UTF8ToWideString(quebra.Strings[3]),'"');
psexo := RemoveAllChars(UTF8ToWideString(quebra.Strings[4]),'"');
pfaixa := RemoveAllChars(UTF8ToWideString(quebra.Strings[5]),'"');
ppeso := RemoveAllChars(UTF8ToWideString(quebra.Strings[6]),'"');
if GetTicket(ticket) = False then
begin
if GetInscricaoXML(pnome, pcategoria, psexo, pfaixa, ppeso, pequipe) = False then
begin
cds_importa_csv_.Append;
cds_importa_csv_dh_inscricao.AsString := RemoveAllChars(quebra.Strings[0],'"');
cds_importa_csv_no_nome.AsString := AnsiUpperCase(RemoveAllChars(UTF8ToWideString(quebra.Strings[1]),'"'));
cds_importa_csv_no_equipe.AsString := RemoveAllChars(UTF8ToWideString(quebra.Strings[2]),'"');
cds_importa_csv_no_categoria.AsString := RemoveAllChars(UTF8ToWideString(quebra.Strings[3]),'"');
cds_importa_csv_no_sexo.AsString := RemoveAllChars(UTF8ToWideString(quebra.Strings[4]),'"');
cds_importa_csv_no_faixa.AsString := RemoveAllChars(UTF8ToWideString(quebra.Strings[5]),'"');
cds_importa_csv_no_peso.AsString := RemoveAllChars(UTF8ToWideString(quebra.Strings[6]),'"');
cds_importa_csv_gn_email.AsString := AnsiLowerCase(RemoveAllChars(UTF8ToWideString(quebra.Strings[7]),'"'));
cds_importa_csv_gn_telefone.AsString := FormatarTelefone(RemoverCaracters(quebra.Strings[8]));
cds_importa_csv_dt_nascimento.AsDateTime := StrToDateTime(FormatarData(RemoverCaracters(quebra.Strings[9])));
cds_importa_csv_.Post;
contador := contador + 1;
end;
end;
end;
end;
CloseFile(csv);
quebra.Free;
if cds_importa_csv_.IsEmpty then
begin
Application.MessageBox('Nenhuma nova inscrição localizada!','Informação',MB_OK+MB_ICONINFORMATION);
lbArquivo.Caption := 'Arquivo:';
end;
|
|
|
Voltar ao Topo |
|
|
DiogoDF83 Novato
Registrado: Sexta-Feira, 19 de Novembro de 2021 Mensagens: 20
|
Enviada: Sex Jan 21, 2022 12:01 pm Assunto: |
|
|
Obrigado. Sempre ajuda. Mas eu não uso clientDataSet. Uso um dataSource no form-dbGrid(q utiliza o sql de um DAO).
Por isso queria inserir direto do dataSource.
Não estou conseguindo.
Obrigado
abraço |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Sex Jan 21, 2022 12:31 pm Assunto: |
|
|
DiogoDF83 escreveu: | Obrigado. Sempre ajuda. Mas eu não uso clientDataSet. Uso um dataSource no form-dbGrid(q utiliza o sql de um DAO).
Por isso queria inserir direto do dataSource.
Não estou conseguindo.
Obrigado
abraço |
Faça um teste tentando acessar os campos assim:
Código: | DBGrid1.DataSource.Dataset.FieldByName('NOMEDOCAMPO').Value := Arquivo[0]; |
Assim vc seta diretamente no Dataset ligado ao Datasource do DBGrid. _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
DiogoDF83 Novato
Registrado: Sexta-Feira, 19 de Novembro de 2021 Mensagens: 20
|
Enviada: Sex Jan 21, 2022 1:53 pm Assunto: |
|
|
Testei das duas formas
Código: |
GridCartoes.DSCartoes.Dataset.FieldByName('NUMERO').AsString := Arquivo[0];
GridCartoes.DataSource.DataSet.FieldByName('NUMERO').AsString := Arquivo[0];
|
Mas deu erro |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Sex Jan 21, 2022 2:13 pm Assunto: |
|
|
GridCartoes é o nome do seu DBGrid?
Qual é a mensagem de erro? _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
DiogoDF83 Novato
Registrado: Sexta-Feira, 19 de Novembro de 2021 Mensagens: 20
|
Enviada: Sex Jan 21, 2022 2:24 pm Assunto: |
|
|
sim. GridCartoes é o nome do dbGrid
erro que da é q nao foi declarado DSCartoes |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Sex Jan 21, 2022 2:35 pm Assunto: |
|
|
A sintaxe correta é:
Código: | GridCartoes.DataSource.DataSet.FieldByName('NUMERO').AsString := Arquivo[0]; |
O "Arquivo[0]" usado no código acima seria o campo número retirado do CSV.
Uma dúvida, tentei fazer um teste com o seu código e não reconheceu os tipos das variáveis:
Código: | var
Arquivo: TTextFile;
TipoRegistro: TTextFileRecordType; |
Quais as Units destes tipos: TTextFile e TTextFileRecordType? _________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
DiogoDF83 Novato
Registrado: Sexta-Feira, 19 de Novembro de 2021 Mensagens: 20
|
Enviada: Sex Jan 21, 2022 2:42 pm Assunto: |
|
|
A var TipoRegistro ja retirei.
Código: |
procedure TfrmRecargaCartoes.ImportaArquivo(aNomeArquivo: String);
var
Arquivo: TTextFile;
begin
Arquivo := TTextFile.Create(nil);
Arquivo.FileName := aNomeArquivo;
Arquivo.FileType := ftDelimitedFields;
Arquivo.FieldsDelimiter := ';';
Arquivo.DecimalDelimiter := ',';
Arquivo.ValidateRecordLayout := False;
Arquivo.RecordTypes.Add;
Arquivo.Open(false);
DSCartoes.DataSet.Insert;
try
while not Arquivo.EndOfFile do
begin
GridCartoes.DataSource.DataSet.FieldByName('NUMERO').AsString := Arquivo[0];
Arquivo.Next;
end;
except
on E:Exception do
raise Exception.Create('Erro na importação');
end;
end;
|
Assim esta o codigo.
Continua o erro, só q agora no Arquivo[0]; |
|
Voltar ao Topo |
|
|
DiogoDF83 Novato
Registrado: Sexta-Feira, 19 de Novembro de 2021 Mensagens: 20
|
Enviada: Sex Jan 21, 2022 2:44 pm Assunto: |
|
|
unit uTextFile;
unit do TextFile |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Sex Jan 21, 2022 3:06 pm Assunto: |
|
|
Creio que esta unit uTextFile seja específica que você criou no seu projeto. Não é ísso?
Você tem que substituir o "Arquivo[0]" pela sintaxe de como pegar o campo número em cada linha do CSV.
Além disso faltou dar um "Append" e um "Post" para gravar os dados.
Exemplo:
Código: | procedure TfrmRecargaCartoes.ImportaArquivo(aNomeArquivo: String);
var
Arquivo: TTextFile;
begin
Arquivo := TTextFile.Create(nil);
Arquivo.FileName := aNomeArquivo;
Arquivo.FileType := ftDelimitedFields;
Arquivo.FieldsDelimiter := ';';
Arquivo.DecimalDelimiter := ',';
Arquivo.ValidateRecordLayout := False;
Arquivo.RecordTypes.Add;
Arquivo.Open(false);
DSCartoes.DataSet.Insert;
try
while not Arquivo.EndOfFile do
begin
GridCartoes.DataSource.DataSet.Append; // adicionei esta linha
GridCartoes.DataSource.DataSet.FieldByName('NUMERO').AsString := 'TESTE'; // trocar TESTE pelo comando para pegar o número no CSV
GridCartoes.DataSource.DataSet.Post; // adicionei esta linha
Arquivo.Next;
end;
except
on E:Exception do
raise Exception.Create('Erro na importação');
end;
end; |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Sex Jan 21, 2022 3:56 pm Assunto: |
|
|
Uma alternativa sem usar a sua unit uTextFile é usando Stinglist para buscar os valores do CSV:
Código: | procedure ImportaArquivo(aNomeArquivo: String);
var
Arquivo, Arquivo2: TStringList;
i: Integer;
begin
Arquivo := TStringList.Create;
Arquivo2 := TStringList.Create;
try
Arquivo.LoadFromFile(aNomeArquivo);
for i := 0 to Arquivo.Count - 1 do
begin
Arquivo2.StrictDelimiter := True;
Arquivo2.Delimiter := ';';
Arquivo2.DelimitedText := Arquivo[i];
gridCartoes.DataSource.DataSet.Open;
gridCartoes.DataSource.DataSet.Append;
gridCartoes.DataSource.DataSet.FieldByName('numero').Value := Arquivo2[0];
gridCartoes.DataSource.DataSet.FieldByName('valor').Value := Arquivo2[1];
gridCartoes.DataSource.DataSet.Post;
end;
finally
Arquivo.Free;
Arquivo2.Free;
end;
end; |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
marcieldeg Colaborador
Registrado: Terça-Feira, 5 de Abril de 2011 Mensagens: 1054 Localização: Vitória - ES
|
Enviada: Dom Jan 23, 2022 4:42 pm Assunto: |
|
|
Uma forma bem interessante de importar CSV no Delphi é utilizando um ADOConnection. Da mesma forma q vc conecta em um arquivo do Access, pode conectar tbm em arquivo CSV, apenas ajustando a string de conexão. Com ele você pode fazer até consultas SQL no conteúdo do arquivo. _________________ "Olha a interface da IDE! Será que ela é? Será que ela é? DELPHI!" |
|
Voltar ao Topo |
|
|
DiogoDF83 Novato
Registrado: Sexta-Feira, 19 de Novembro de 2021 Mensagens: 20
|
Enviada: Seg Jan 24, 2022 3:16 pm Assunto: |
|
|
Boa tarde pessoal
Não está delimitando ?
Código: |
DSCartoes.DataSet.BeforeInsert := nil;
Arquivo := TStringList.Create;
Arquivo2 := TStringList.Create;
Arquivo.LoadFromFile(aNomeArquivo);
Arquivo2.StrictDelimiter := False;
Arquivo2.Delimiter := ';';
try
for i := 0 to Arquivo.Count - 1 do
begin
Arquivo2.DelimitedText := Arquivo.Strings[i];
Numero := Arquivo2.Strings[i];
//Saldo := StrToFloat(Arquivo2.Strings[i]);
GridCartoes.DataSource.DataSet.Open;
GridCartoes.DataSource.DataSet.Insert;
GridCartoes.DataSource.DataSet.FieldByName('NUMERO').Value := Numero;
//GridCartoes.DataSource.DataSet.FieldByName('SALDO').Value := Saldo;
GridCartoes.DataSource.DataSet.Post;
end;
finally
Arquivo.Free;
Arquivo2.Free;
DSCartoes.DataSet.BeforeInsert := SolicitacoesBeforeInsert;
end;
|
Esta vindo todo a linha ex: 123456;1,99;
no caso teria q vim só 123456 |
|
Voltar ao Topo |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Seg Jan 24, 2022 6:18 pm Assunto: |
|
|
Faça um teste com seu código assim:
Código: | DSCartoes.Dataset.BeforeInsert := nil;
Arquivo := TStringList.Create;
Arquivo2 := TStringList.Create;
try
Arquivo.LoadFromFile(aNomeArquivo);
for i := 0 to Arquivo.Count - 1 do
begin
Arquivo2.StrictDelimiter := False;
Arquivo2.Delimiter := ';';
Arquivo2.DelimitedText := Arquivo[i];
Numero := Arquivo2[0];
// Saldo := StrToFloat(Arquivo2.Strings[i]);
GridCartoes.DataSource.Dataset.Open;
GridCartoes.DataSource.Dataset.Insert;
GridCartoes.DataSource.Dataset.FieldByName('NUMERO').Value := Numero;
// GridCartoes.DataSource.DataSet.FieldByName('SALDO').Value := Saldo;
GridCartoes.DataSource.Dataset.Post;
end;
finally
Arquivo.Free;
Arquivo2.Free;
DSCartoes.Dataset.BeforeInsert := SolicitacoesBeforeInsert;
end; |
_________________ ''A persistência é o caminho para o êxito.''
Charlie Chaplin |
|
Voltar ao Topo |
|
|
|