SAS importar o ficheiro txt usando o infile

Estou a olhar para dois procedimentos para importar dois ficheiros txt no SAS. O primeiro ficheiro é de Largura Fixa. O segundo ficheiro txt é um ficheiro delimitado. O código SAS a seguir apresentado:

  1. DATA filename;  
    INFILE "filelocation";  
    INPUT  
    VAR1 $1-11  
    VAR2 $13-16  
    @18 VAR3 MMDDYY10.   
    VAR4 $29-53;  
    
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    ;  
    RUN;  
    
  2. DATA filename;  
    INFILE "filelocation" DELIMITER="|" MISSOVER  
    DSD LRECL=32767;  
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    INPUT  
    VAR1 $  
    VAR2 $  
    VAR3   
    VAR4 $  
    ;  
    RUN;  
    
As minhas perguntas são: 1. Por que a" entrada " localiza-se no início do código no primeiro procedimento, mas no último no segundo procedimento? A ordem de "entrada" importa?

  1. no primeiro procedimento, há um "@18 " na frente do VAR3, qual VAR3 é uma variável representa a data,e determina que o VAR3 começa a partir da posição 18. Todas as variáveis podem usar esta expressão? ex. @1 VAR1 $
    @13 VAR2 $
    @18 VAR3 MMDDYY10.
    @29 VAR4 $;

  2. no processo 2,
    ENTRADA VAR1 $
    VAR2 $
    VAR3
    VAR4 $
    por que a variável não tem nenhum número após o sinal "$" para determinar o comprimento da variável?

Obrigado!

Author: mumu.W, 2016-01-05

2 answers

A principal diferença de que está a falar é a diferença entre os dados armazenados em locais fixos de colunas e os dados delimitados. Dado que o seu primeiro exemplo usa dados com localizações fixas de colunas, poderá usar gamas de colunas (1-11) para ler os dados. Com os dados delimitados, não poderá indicar colunas fixas (ou mesmo comprimentos fixos para ler), dado que não sabe quantos caracteres existem entre os delimitadores. Em vez disso, deverá usar o modo de entrada da lista e o SAS irá ler o valor até ao próximo delimitador.

Vamos tratar das questões detalhadas.
    Porquê? Porque foi assim que o programa foi escrito. Há muita flexibilidade na forma como você escreve código SAS.

A coisa importante para entender sobre a ordem das declarações ao construir um conjunto de dados é o impacto que a ordem pode ter no resultado. O SAS irá tentar determinar a definição das variáveis que está a usar assim que puder. Então, se você colocar uma declaração FORMAT antes a sua declaração INPUT Pode afectar tanto o tipo de variável que o SAS cria como a ordem em que são criados na etapa de dados.

    Não, não são iguais.

Quando lhe pedes para ler {[[3]} estás a pedir-lhe para ler o que está nas colunas 1 a 11, incluindo os espaços em branco incorporados. Ele também sabe que você quer que VAR1 seja definido como personagem (uma vez que você usou o $) e deve ter espaço para 11 bytes. Quando você pedir para ler @1 VAR1 $ ele vai ler o próximo palavra que vê a começar na coluna 1. Vai parar no primeiro espaço em branco. Pode ler as colunas 1 a 5 ou pode ler as colunas 70 a 77, se as colunas 1 a 69 estiverem em branco. Também fará com que o VAR1 tenha um comprimento de apenas 8 (a menos que você o tenha definido anteriormente) uma vez que este é o padrão para variáveis de caracteres quando o SAS não pode dizer que você quer um comprimento diferente.

A razão pela qual o programa original usado @18 VAR3 MMDDYY10. é porque você precisa especificar o informat para ter SAS adequadamente converter o texto nos dados no número que a SAS usa para representar essa data e você não pode fazer isso com um intervalo de colunas.

  1. não precisas do comprimento. Você nem sequer precisa do $ uma vez que você já definiu o tipo de variável.

Já definiu previamente o comprimento da variável da primeira vez que foram referenciados. Assim, a(s) declaração (ões) INFORMAT teve o efeito colateral de definir o comprimento da variável para além dos dados que devem ser usado para converter o texto a ser lido. Se realmente quiser definir as suas variáveis, deve usar uma declaração LENGTH ou ATTRIB.

 1
Author: Tom, 2016-01-06 04:19:51
  1. Devido à forma como a SAS processa um passo de dados, a ordem das declarações nem sempre importa. Não sei, neste caso, se importa ou não, mas não é nada convencional. Normalmente, o formato / informação vem antes da declaração de entrada. Mas pode verificá-lo facilmente.
  2. Este é o método de controlo do cursor e move o cursor de leitura para a coluna indicada. A documentação é clara:

    @n move o cursor para a coluna n.

  3. $ especifica uma variável de caracteres, o comprimento ou o formato da variável não é necessário e pode ser previamente especificado usando uma declaração INFORMAT/FORMAT/LENGTH.
 0
Author: Reeza, 2016-01-05 22:50:21