Ir para conteúdo
Fórum Script Brasil
  • 0

Importação Csv > Paradox


Eder

Pergunta

Ola..

tenho este codigo abaixo que uso pra importar dados *.csv > paradox:

Var
ArqLido,           
ArqSize : Integer; 
Txt: TextFile;
Entrada: String;
Linhas: Integer;
now_temp: TDateTime;//variavel contadora de tempo
begin
  Update;
  STATUS.CAPTION:='Convertendo Ddaod';
  UpDate;
  now_temp:=now;//recebe tempo
  tempo.caption:= '00:00:00';
  TABLE1.Active:=TRUE;
  Assignfile(Txt,'C:\XXXREL\CLIENTES.TXT');//caminho do arquivo TXT
  Reset(Txt);
  ArqLido := 0;
  ArqSize := FileSize(txt) *128;  // *** FileSize assume blocos de 128 quando não é arquivo "tipado"
  gauge1.MaxValue := 104;  // *** equivale a 100 +4 valores que você incrementa na mão
  Linhas := 0;
  While not Eoln(Txt) do
  begin
    Readln(Txt,Entrada);
    ArqLido := ArqLido +Length(Entrada)+2;  //*** este 2 = CR+LN (presumido)
    Gauge1.Progress := Trunc(ArqLido/ArqSize *100);  // *** progress chegará no máximo a 100 (%)
    //
    Inc(Linhas);
    If Linhas > 4 then//aqui verifica e desconcidera AS 4 primeiras linhas do CSV
{MAIS UM IF AQUI}
    begin
      Table1.Insert;//Abaixo converte pra *.DB..lembrando que antes deve criar o DB no DataBase Desktop.
      Table1.FieldByName('C').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);
      Delete(Entrada, 1, Pos(PathSep, Entrada));
      Table1.FieldByName('cliente').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);
      Delete(Entrada, 1, Pos(PathSep, Entrada));

EU Precisaria colocar mais um IF ali onde diz {MAIS UM IF AQUI} este If seria pra filtrar a COLUNA UF=SC

então ele processaria somentos os clientes do estado de SC.

Não sei se fui claro......

como esta hoje não existe filtro por estado ta pegando e convertendo tudo......

Grato

Editado por Micheus
Substituída tag QUOTE por CODE. Por favor utilize a tag adequada.
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
If Linhas > 4 then//aqui verifica e desconcidera AS 4 primeiras linhas do CSV

{MAIS UM IF AQUI}

begin

Table1.Insert;//Abaixo converte pra *.DB..lembrando que antes deve criar o DB no DataBase Desktop.

Table1.FieldByName('C').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);

Delete(Entrada, 1, Pos(PathSep, Entrada));

Table1.FieldByName('cliente').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);

Delete(Entrada, 1, Pos(PathSep, Entrada));

Eder basta seguir a mesma lógica procurar e copiar

if pos('SC', Entrada) > 0  then //  se achar na linha 'SC' retorna a posição onde foi encontrada 

//function Copy(S; Index, Count: Integer): string;

Table1.FieldByName('estado').Value := Copy(Entrada, pos('SC', Entrada), 2);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Ola...

Beleza?

Jonas....eu não observei que.....o if que quero fazer não é da linha e sim da Coluna do aquivo....

eu tenho um aplicativo aqui que faz o if assim:

If (Copy(Entrada, 1, 1) = '3') then

nesta caso...ele se refere a primeira coluna com apenas um dígito...

Este código alguém me passou e eu não me lembro mais este raciocinio do codigo.....

este campo UF esta bem no meio dos dados.....ele é o Oitavo campo...

Compreendeu???...só gostaria que você me explicasse este if como é a logica dele...como ele pega o valor??

Grato

Link para o comentário
Compartilhar em outros sites

  • 0
Jonas....eu não observei que.....o if que quero fazer não é da linha e sim da Coluna do aquivo....

eu tenho um aplicativo aqui que faz o if assim:

If (Copy(Entrada, 1, 1) = '3') then
nesta caso...ele se refere a primeira coluna com apenas um dígito... Este código alguém me passou e eu não me lembro mais este raciocinio do codigo..... este campo UF esta bem no meio dos dados.....ele é o Oitavo campo...
Ele está especificamente na 12 coluna. :D O seu código completo está neste post - eu lembrei dele. Uma saída simplista (não a melhor) seria você deixar exatamente como está e acrescentar o teste após a leitura da UF. Uma vez testado, você cancela a inserção e volta ao início do while, caso não seja SC, ou continua e grava o resgistro:
...
      Table1.FieldByName('cidade_destino').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);
      Delete(Entrada, 1, Pos(PathSep, Entrada));
      Table1.FieldByName('uf_destino').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);
      if Table1.FieldByName('uf_destino').Value <> 'SC' then
      Begin
        Table1.Cancel;  // cancela inserção
         Continue;  // volta para o While lá em cima
      End;
      Delete(Entrada, 1, Pos(PathSep, Entrada));
      Table1.FieldByName('qtde_volume').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);
      Delete(Entrada, 1, Pos(PathSep, Entrada));
...

Há uma outra possibilidade, mas agora não dá para exemplificar - tentarei postar mais tarde. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Ele está especificamente na 12 coluna.

O seu código completo está neste post - eu lembrei dele.

R.: não este é outro.....aquele era de conhecimento de transportes rodoviario de cargas...e este agora é de clientes(somente)

a coluna agora é a 9.....rs :)

Uma saída simplista (não a melhor) seria você deixar exatamente como está e acrescentar o teste após a leitura da UF. Uma vez testado, você cancela a inserção e volta ao início do while, caso não seja SC, ou continua e grava o resgistro:

CODE

...

Table1.FieldByName('cidade_destino').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);

Delete(Entrada, 1, Pos(PathSep, Entrada));

Table1.FieldByName('uf_destino').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);

if Table1.FieldByName('uf_destino').Value <> 'SC' then

Begin

Table1.Cancel; // cancela inserção

Continue; // volta para o While lá em cima

End;

Delete(Entrada, 1, Pos(PathSep, Entrada));

Table1.FieldByName('qtde_volume').Value := Copy(Entrada,1, Pos(PathSep, Entrada) - 1);

Delete(Entrada, 1, Pos(PathSep, Entrada));

...

R.: beleza..deu certo....era tão fácil nem pensei nisto..... :blush:

valeu...muito Grato

abraço :D

Link para o comentário
Compartilhar em outros sites

  • 0
Há uma outra possibilidade, mas agora não dá para exemplificar - tentarei postar mais tarde. ;)
foi um pouco mais que "mais tarde". :rolleyes:

R.: beleza..deu certo....era tão fácil nem pensei nisto..... :blush:
Eder, se estes arquivos a serem importados seguem corretamente a padronização de colunas (cada linha tem a mesma quantidade de colunas), utiliza um caracter de delimitação de campos (colunas) e se adicionarmos (em design-time) apenas os campos necessários ao dataset, poderemos criar uma função genérica que pode funcionar para a maioria dos casos de importação deste tipo.

No exemplo, eu utilizei um dataset com 8 campos nesta ordem: CdFolha, CdDesenho, CdPasta, CdTitulo, DsFolha, DsRevisao, VlAno, InSituacao. No entanto, o arquivo de importação possui apenas informação para 4 campos: DsFolha, CdFolha, CdDesenho, CdTitulo. Para utilizar o procedimento como mencionei, adicionei ao dataset (em design-time) apenas os referidos campos, e na ordem em que os mesmos estarão organizados no arquivo de importação.

Vejamos como está parte do arquivo a ser importado:

"DsFolha","CdFolha","CdDesenho","CdTitulo"
"1",1,1,1
"1/3",2,2,2
"2/3",3,3,2
"1",4,4,3
...
este arquivo tem 2989 linhas, sendo a primeira a de cabeçalho. A procedure de importação - genérica, que pode ser colocada em uma unit de utilidades:
procedure ImportFile(DataSet :TDataSet;  // dataset a incluir os dados importados
                     ProgressBar :TProgressBar;  // Barra de progresso
                     FirstRowData :Word;  // Primeira linha de dados - começa em 0 (zero)
                     FileToImport :String);  // Nome do arquivo a ser importado
var
  DSActive :Boolean;
  Idx,
  IdxField :Integer;
  Columns,
  ArqToImport :TStringList;
begin
  Columns := TStringList.Create;
  Columns.Delimiter := ',';  // define o delimitador de campo
  Columns.QuoteChar := '"';  // define o limitador de strings
  ArqToImport := TStringList.Create;
  try
    DSActive := DataSet.Active;  // salva condição inicial do dataset
    DataSet.Active := True;  // força abertura do dataset
    ArqToImport.LoadFromFile(FileToImport);  // carrega arquivo a ser importado
    ProgressBar.Max := ArqToImport.Count;  // inicializa barra de progresso
   // processa todas as linhas do arquivo sendo importado
    for Idx := FirstRowData to ArqToImport.Count -1 do
    begin
      Columns.DelimitedText := ArqToImport[Idx];  // desmembra a linha em colunas - campos
      ProgressBar.Position := Idx;  // move o indicador de progresso
      DataSet.Append;  // Inicializa novo registro
     // atribui cada coluna lida à um campo do dataset
     // organizados na mesma seqüência
      for IdxField := 0 to DataSet.FieldCount -1 do
        DataSet.Fields[IdxField].AsString := Columns[IdxField];
      DataSet.Post;  // grava informações
      Application.ProcessMessages;  // permite processamento de mensagens
    end;
  finally
    DataSet.Active := DSActive;  // retorna a condição incial
    ProgressBar.Position := 0;  // reinicializa a barra
    ArqToImport.Free;  // libera linhas importadas
    Columns.Free;      // libera colunas importadas
  end;
end;
Como usá-la:
// botão para start da importação
procedure TForm1.Button1Click(Sender: TObject);
begin
 // Elimino os registros da minha tabela temporária
  Table1.EmptyTable;

  Table1.Open;
 // no arquivo exemplo, a 1ª linha (seria a 0 - zero) contém
 // o nome das colunas. Neste caso eu não vou importá-la, logo
 // começamos a partir de 1 (2ª linha)
  ImportFile(Table1, ProgressBar1, 1, 'Arquivo.csv');
end;
Para o seu caso, você poderia apenas colocar o código no lugar da procedure atual, e testar a coluna do estado (9) desta forma:
...
      Columns.DelimitedText := ArqToImport[Idx];  // desmembra a linha em colunas - campos
      ProgressBar.Position := Idx;  // move o indicador de progresso
      if Columns[8] <> 'SC' then  // 8 porque começa em 0, ou seja 9-1=8
        Continue;
      DataSet.Append;  // Inicializa novo registro
     // atribui cada coluna lida à um campo do dataset
     // organizados na mesma seqüência
      for IdxField := 0 to DataSet.FieldCount -1 do
        DataSet.Fields[IdxField].AsString := Columns[IdxField];
...

Se funcionar bem, você há de notar o quanto diminui as linhas de código. A quantidade que tem naquele outro post, é gigantesca. :D

Abraços

Importacao_Arquivos.zip

Link para o comentário
Compartilhar em outros sites

  • 0

Oba..Micheus..agora que vi sua resposta..

carinha....como é bastante codigo que você postou....eu final de semana vou dar uma estudada com calma em casa...

Realmente.....otimiza bastante o codigo, e é mais uma opção pra importar.....

Esta semana tou meio enrrolado aqui na empresa..então só sobrou em casa...rs.

Inclusive tou com um problema num relatorio que postei aqui no forum de manhã..tenho que terminar este relotorio até amanhã....não sei como..mas vou tentar.. :blush:

valeu....por mais esta dica....

Abraço

:)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...