Proc Append: Adicionando / Anexando Bases no SAS

Vamos supor que você tenha um código que crie diversas bases diferentes, e no fim dele você deseja empilhar todas elas. Normalmente, você poderia simplesmente empilhar as bases com um data step tradicional:

data base_final;
    set base_1
        base_2
        base_3
        ...
run;

Até que é tranquilo. Porém, você precisariar criar um passo a mais, o que deixaria tudo menos automatizado. Além de ter que ficar digitando na mão, correndo o risco de esquecer o que está fazendo.

O mais fácil é utilizar um comando do SAS que “apenda” as bases. Ou seja, um comando que pega a primeira base e vai acrescentando as demais.

Este comando é o proc append.

Basicamente, o comando vai empilhando as bases que são geradas. Veja alguns exemplos de códigos que ficam úteis com o comando:

1) Código que vai numa base maior para uma data específica, filtra os clientes de uf = MG, e vai empilhando as bases só com MG. Cada base nova gerada vai sendo colocada abaixo das anteriores, formando assim uma base final com todos os arquivos importados juntos. Utilizo a variável dt_ref como sendo a data de referência.:

%macro importa_mg(dt_ref);

/*filtra clientes mg*/
data tabela_mg_&dt_ref.;
    set tabela_origem_&dt_ref.;
    if uf = "MG";
run;

/*gera base final e anexa todas*/
proc append base= base_final data= tabela_mg_&dt_ref.;
run;

%mend;

Para gerar uma tabela com clientes das datas 20180101, 20180102 e 20180103:

%importa_mg(20180101);
%importa_mg(20180102);
%importa_mg(20180103);

2) Macro que importa diversas bases em .txt: a macro busca o arquivo, trata o campo CPF e gera um output. Cada base nova gerada vai sendo colocada abaixo das anteriores, formando assim uma base final com todos os arquivos importados juntos:

%macro importa_txt(base_importada);

proc import out = base_importada
datafile = "/diretorio/&base_importada..txt" 
DBMS = TAB REPLACE; delimiter='|' ;
run;

DATA base_importada_2;
sysecho "trata cpf de &base_importada.";
     SET base_importada;
     length cpf $11.;
     cpf = PUT(cpf, Z11.);
RUN;

proc append base=base_final data= base_importada_2;
sysecho "apenda &base_importada.";
run;

%mend();

Para importar as bases, basta utilizar a macro do exemplo (1), porém, neste caso deve utilizar o nome do arquivo txt:

%importa_txt(nome_do_arquivo_1);
%importa_txt(nome_do_arquivo_2);
%importa_txt(nome_do_arquivo_3);

Se quiser dar um up para sua macro, utilize o SYSECHO. Com ele, você pode acompanhar em que passo está a execução:

%macro importa_mg(dt_ref);

/*filtra clientes mg*/
data tabela_mg_&dt_ref.;
sysecho "data set para &dt_ref.";
    set tabela_origem_&dt_ref.;
    if uf = "MG";
run;

/*gera base final e anexa todas*/
proc append base= tabela_final data= tabela_mg_&dt_ref.;
sysecho "anexa &dt_ref.";
run;

%MEND;

Se este post te ajudou de alguma forma, curte o link ou deixe um comentário. E se tiver outros amigos que trabalham com esse material, não deixe de compartilhar com eles o site.  Obrigado.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *