ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[Resolvido]de CSV para dbGrid
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
DiogoDF83
Novato
Novato


Registrado: Sexta-Feira, 19 de Novembro de 2021
Mensagens: 20

MensagemEnviada: Sex Jan 21, 2022 9:53 am    Assunto: [Resolvido]de CSV para dbGrid Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
netoferreira
Novato
Novato


Registrado: Sexta-Feira, 19 de Dezembro de 2014
Mensagens: 77
Localização: Macapá - AP

MensagemEnviada: Sex Jan 21, 2022 11:18 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
DiogoDF83
Novato
Novato


Registrado: Sexta-Feira, 19 de Novembro de 2021
Mensagens: 20

MensagemEnviada: Sex Jan 21, 2022 12:01 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Jan 21, 2022 12:31 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
DiogoDF83
Novato
Novato


Registrado: Sexta-Feira, 19 de Novembro de 2021
Mensagens: 20

MensagemEnviada: Sex Jan 21, 2022 1:53 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Jan 21, 2022 2:13 pm    Assunto: Responder com Citação

GridCartoes é o nome do seu DBGrid?

Qual é a mensagem de erro?
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
DiogoDF83
Novato
Novato


Registrado: Sexta-Feira, 19 de Novembro de 2021
Mensagens: 20

MensagemEnviada: Sex Jan 21, 2022 2:24 pm    Assunto: Responder com Citação

sim. GridCartoes é o nome do dbGrid


erro que da é q nao foi declarado DSCartoes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Jan 21, 2022 2:35 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
DiogoDF83
Novato
Novato


Registrado: Sexta-Feira, 19 de Novembro de 2021
Mensagens: 20

MensagemEnviada: Sex Jan 21, 2022 2:42 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
DiogoDF83
Novato
Novato


Registrado: Sexta-Feira, 19 de Novembro de 2021
Mensagens: 20

MensagemEnviada: Sex Jan 21, 2022 2:44 pm    Assunto: Responder com Citação

unit uTextFile;

unit do TextFile
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Jan 21, 2022 3:06 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Jan 21, 2022 3:56 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcieldeg
Colaborador
Colaborador


Registrado: Terça-Feira, 5 de Abril de 2011
Mensagens: 1054
Localização: Vitória - ES

MensagemEnviada: Dom Jan 23, 2022 4:42 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
DiogoDF83
Novato
Novato


Registrado: Sexta-Feira, 19 de Novembro de 2021
Mensagens: 20

MensagemEnviada: Seg Jan 24, 2022 3:16 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Seg Jan 24, 2022 6:18 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB