Есть ли способ добавить два набора данных, чтобы более длинный формат имел приоритет? - PullRequest
1 голос
/ 04 января 2011

Рассмотрим этот простой пример:

data abc;
  length a $2 b $1;
  a = "aa";
  b= "b";
run;

data def;
  length a $1 b $2;
  a = "a";
  b= "bb";
run;

data ghi;
   set abc def;
run;

В этом примере набор данных ghi имеет две переменные, но их длина определяется содержимым набора данных abc. Есть ли способ (без записи макросов) добавить два набора данных, чтобы, если имена переменных совпадали, более длинная длина имела преимущество? То есть в этом примере a и b в наборе данных ghi имеют длину 2.

1 Ответ

2 голосов
/ 04 января 2011

Если у вас не очень много переменных, вы можете вручную сгенерировать оператор длины для вашего комбинированного набора данных, как показано ниже. Обратите внимание, что существует ограничение в 32 КБ на длину значения макропеременной. Это также может испортить существующий порядок переменных.

   /* test data */
   data abc;
     length a $2 b $1;
     a = "aa";
     b= "b";
   run;

   data def;
     length a $1 b $2;
     a = "a";
     b= "bb";
   run;

   /* max lenghs for each and every char type var */
   proc sql;
     create view abcview as
     select name, length
     from dictionary.columns 
     where libname="WORK" and memname="ABC" and type="char";

     create view defview as
     select name, length
     from dictionary.columns
     where libname="WORK" and memname="DEF" and type="char";

     select catx(" $", a.name, max(a.length, d.length)) 
        into :lengths separated by " "
     from abcview as a, defview as d
     where a.name = d.name;
   quit;

   data ghi;
     length &lengths;
     set abc def;
   run;

   proc contents data=ghi;
   run;
   /* on lst - in part
       #    Variable    Type    Len
       1    a           Char      2
       2    b           Char      2
   */
...