Импорт нескольких текстовых (txt) файлов в SAS (файлы имеют переменные атрибуты в первых 2 строках)

#sas #sas-macro

Вопрос:

Я пытаюсь импортировать несколько текстовых файлов в SAS. Особенность данных заключается в том, что в первой строке есть метки для некоторых переменных, а во второй строке есть текст, указывающий тип некоторых переменных. В третьей строке указаны имена переменных. Я намеревался использовать макрос для чтения файлов, так как первые 7 переменных имеют одинаковые имена. Я не уверен, как программно обрабатывать атрибуты переменных в файлах. Пожалуйста, подскажите, как я мог бы это сделать.

Код до сих пор:

     %macro text2sas(filenam=);

  proc import datafile="../amp;filenam..txt"
              out="amp;filenam"
              dbms=dlm replace ;
              delimiter = '09'x;
              getnames=no;
              datarow=1;
              guessingrows=max;
  run;
%mend text2sas;

%text2sas(filenam=convdat);
%text2sas(filenam=tratdat);
 

Данные для convdat.txt выглядит так:

 "Dance retail:" "Dummy measurement completed successfully?" "Dramatic measurements?"    "Maximal travel :"  "Velocity time at start:"   "Mean velocity at start:"   "Maximal velocity at end:"  "Velocity time iinterval:"  "Mean velocity interval:"   "Crain Dp:" 
                            date    string  string  number  number  number  number  number  number  number  
RELAXT  RAIN    PLUCK   RAPPLE  VRAT    GROSS   PANGLE  "Straint"   "Etramp"    "Crumpa"    "Cafin" "Cafinat"   "Cafinab"   "Cafinavr"  "Cafinap"   "cafinal"   
X5980B00099 "CF"    G0001001    1234    "Vlapa1"    1   "Crt appoi" "10-May-2010"   "1" "1" ""  ""  ""  ""  ""  ""  ""  
X5980B00099 "CF"    G0001002    1234    "Vlapa1"    1   "Crt appoi" "13-May-2010"   "1" "1" ""  ""  ""  ""  ""  ""  ""  
X5980B00099 "CF"    G0001003    1234    "Vlapa1"    1   "Crt appoi" "19-may-2010"   "1" "1" ""  ""  ""  ""  ""  ""  ""  
X5980B00099 "CF"    G0001004    1234    "Vlapa1"    1   "Crt appoi" "26-may-2010"   "1" "1" "0.45"  "0.55"  "0.98"  "0.76"  "0.98"  "0.12"  "5.77"  
 

Данные для тратдата выглядят так:

                             "Arbitrary carpets" "Household items"   "Garage material"   "Sundry data (everything else)" "Vehicle number"    "Strains"   "ITM"   "Finals"    "Dreadspan" "Printers"  "Comment 1" "comment 2" "Grapple"   "Drops" "Triangles" 
                            boolean boolean boolean boolean boolean boolean boolean boolean boolean boolean string  boolean boolean boolean boolean 
RELAXT  RAIN    PLUCK   RAPPLE  VRAT    GROSS   PANGLE  "Ant"   "App"   "Cro"   "BRon"  "Dramas"    "Slacks"    "CRAT"  "Frob"  "Rilo"  "Ph7jj" "P10rt" "Irup"  "GLk2"  "Dap3"  "Oreta" 
X5980B00099 "GB"    G0001001    1234    "Vlapa1"    1   "Pangolin train"    ""  "checked"   ""  "checked"   ""  "checked"   "checked"   ""  ""  ""  ""  ""  ""  ""  ""  
X5980B00099 "GB"    G0001002    1234    "Vlapa1"    1   "Pangolin train"    ""  ""  ""  "checked"   ""  "checked"   "checked"   ""  ""  ""  ""  ""  ""  ""  ""  
X5980B00099 "GB"    G0001003    1234    "Vlapa1"    1   "Pangolin train"    "checked"   ""  ""  "checked"   ""  "checked"   "checked"   ""  ""  ""  ""  ""  ""  ""  ""  
X5980B00099 "GB"    G0001004    1234    "Vlapa1"    1   "Pangolin train"    "checked"   ""  ""  "checked"   ""  "checked"   "checked"   ""  ""  ""  ""  ""  ""  ""  ""  
 

Комментарии:

1. Являются ли переменные одинаковыми в каждом из файлов или только в первых 7? Попробуйте установить значение datarow=3 равно 1, чтобы начать с строки 3, но таким образом вы не получите никаких имен переменных.

2. Во-первых, для этого вам не нужен макрос. Во-вторых, попробуйте использовать шаг данных с инструкциями ввода / вывода для чтения файла .txt.

3. Спасибо за ваш ответ. Только первые 7 переменных одинаковы.

Ответ №1:

Окончательный ввод будет включать указание SAS перейти к строке 3, но, как отмечает Риза, вы потеряете свои метаданные, если просто перейдете к Datarow=4 ней .

Я рекомендую проанализировать файл на этапе предварительной обработки и преобразовать эти метаданные во входные инструкции. Это может быть сложно, но это не должно быть так уж плохо… однако это выходит за рамки ответа на StackOverflow.

Вы можете посмотреть в моих презентациях Написание кода С помощью вашего программирования на основе данных и документации (в соавторстве), чтобы узнать, какие действия вы можете выполнить в отношении написания входных инструкций. У вас нет в точности того, что ожидает каждый из них, но вы можете ввести эти первые несколько строк, используя ввод шага данных, а затем перенести этот набор данных в более полезный формат.

Комментарии:

1. Спасибо вам за это. Я посмотрю вашу презентацию.

Ответ №2:

Похоже, что в первых трех строках есть МЕТКА, ТИП и ИМЯ для столбцов. Поэтому сначала прочтите это и используйте информацию для создания кода для чтения фактических строк данных.

Что-то вроде этого:

 data headers ;
  length row col 8 type $32 value $200 ;
  infile file2 dsd dlm='09'x truncover length=ll column=cc ;
  do type='LABEL','TYPE','NAME';
    row 1;
    do col=1 by 1 until(cc>ll);
      input value @ ;
      if not missing(value) then output;
    end;
    input;
  end;
  stop;
run;
proc sort; by col row; run;
proc transpose data=headers out=meta(drop=_name_) ;
  by col;
  id type ;
  var value;
run;
 

Который для этого второго файла должен получить такие данные, как:

 Obs    col    NAME      LABEL                             TYPE

  1      1    RELAXT
  2      2    RAIN
  3      3    PLUCK
  4      4    RAPPLE
  5      5    VRAT
  6      6    GROSS
  7      7    PANGLE
  8      8    Ant       Arbitrary carpets                boolean
  9      9    App       Household items                  boolean
 10     10    Cro       Garage material                  boolean
 11     11    BRon      Sundry data (everything else)    boolean
 12     12    Dramas    Vehicle number                   boolean
 13     13    Slacks    Strains                          boolean
 14     14    CRAT      ITM                              boolean
 15     15    Frob      Finals                           boolean
 16     16    Rilo      Dreadspan                        boolean
 17     17    Ph7jj     Printers                         boolean
 18     18    P10rt     Comment 1                        string
 19     19    Irup      comment 2                        boolean
 20     20    GLk2      Grapple                          boolean
 21     21    Dap3      Drops                            boolean
 22     22    Oreta     Triangles                        boolean
 

Которые вы можете использовать для создания кода, например:

 data want ;
  infile file2 dsd dlm='09'x truncover firstobs=4 ;
  input
    RELAXT :$20.
    RAIN :$5.
    PLUCK :$20.
    RAPPLE 
    VRAT  :$20.
    GROSS 
    PANGLE :$40.
    Ant :$1.
    App :$1.
    Cro :$1.
    BRon :$1.
    Dramas :$1.
    Slacks :$1.
    CRAT :$1.
    Frob :$1.
    Rilo :$1.
    Ph7jj :$1.
    P10rt :$50.
    Irup :$1.
    GLk2 :$1.
    Dap3 :$1.
    Oreta :$1.
  ;
  label
    Ant ="Arbitrary carpets"
    App ="Household items"
    Cro ="Garage material"
    BRon ="Sundry data (everything else)"
    Dramas ="Vehicle number"
    Slacks ="Strains"
    CRAT ="ITM"
    Frob ="Finals"
    Rilo ="Dreadspan"
    Ph7jj ="Printers"
    P10rt ="Comment 1"
    Irup ="comment 2"
    GLk2 ="Grapple"
    Dap3 ="Drops"
    Oreta ="Triangles"
  ;
run;
 

Комментарии:

1. Это действительно полезно, я принимаю его, и он работает для извлечения метаданных из файла. Спасибо за ваш совет.