Как сравнить структуру таблицы в SAS - PullRequest
3 голосов
/ 29 сентября 2010

Я тестер, и мне нужно сравнить структуру двух наборов данных (не данных таблицы) в SAS. Я пытался использовать 'proc Compare', но он сравнивает данные. Я хочу сравнить набор данных / структуру таблицы (имя столбца, тип данных, нулевые ограничения и т. Д.)

Может ли кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

6 голосов
/ 30 сентября 2010

Вы можете запросить представления в SASHELP (vtable, vcolumn и т. Д.), Чтобы сделать это. Быстрый способ - создать временную таблицу из sashelp.vcolumn для каждой из двух таблиц, которые вы хотите сравнить, а затем использовать соединение PROC SQL для их сравнения. Затем вы будете сравнивать структуры, которые представлены в данных из vcolumn.

Чтобы начать, посмотрите, что находится в SASHELP.vcolumn.

Вот базовый пример использования этого метода для сравнения переменных в 2 наборах данных.

* provide names of the two data sets here ;
%let ds1=TheFirstDataSet;
%let ds2=TheOtherDataSet;

* upcase the data set names ;
%let ds1=%sysfunc(upcase(&ds1));
%let ds2=%sysfunc(upcase(&ds2));

proc sql;
* retrieve info on these tables from sashelp.vcolumn;
  create table first as select * from sashelp.vcolumn where upcase(memname)="&ds1";
  create table second as select * from sashelp.vcolumn where upcase(memname)="&ds2";
* join these data sets and report on differences for var names;
  select coalescec(f.name,s.name) as varName
        ,case
          when f.name is null then "This var is in &ds2 only"
          when s.name is null then "This var is in &ds1 only"
          else 'This var is in both data sets'
          end as DiffDescription
  from 
    first as f
    full outer join 
      second as s 
      on f.name=s.name
  ;
quit;

Вы можете обобщить это для других атрибутов, таких как тип данных, длина, метка и т. Д., Все из которых доступны в vcolumn.

  • Обратите внимание, что вам может потребоваться изменить этот код, чтобы он соответствовал библиотекам, которые могут иметь ваши наборы данных.
3 голосов
/ 04 октября 2010

Вы можете записать части дескриптора в наборы данных, используя proc contents, а затем proc compare, чтобы увидеть, как их структуры различаются.Опция out2 запишет ограничения целостности, если они существуют.Если нет, то набор данных будет пустым.Можно ожидать, что некоторые столбцы, такие как CRDATE (дата создания) или LIBNAME или MEMNAME, могут отличаться, поэтому вы можете исключить их из сравнения.

/* create some fake data similar to an existing one */
proc sql;
create table myclass as 
  select *, "foo" as newcol from sashelp.class
;
/* modify it */
  insert into myclass
     values ("George", "M", 17, 72, 169,"foo");
/* add an index */
  create index names on
     work.myclass(name, age);
quit;

/* write out descriptor portions to data sets */
proc contents data=myclass out=ds1 out2=ds2;run;
/* sashelp.class doesn't have an index so ds2a will not exist */
proc contents data=sashelp.class out=ds1a out2=ds2a;run;

/* compare data set structures */
proc compare data=ds1 compare=ds1a;run;
1 голос
/ 23 октября 2014

1 - Используйте PROC CONTENTS, чтобы получить описание набора данных (имя набора данных, имя переменной, метка переменной, тип переменной ....)

2- PROC SORT весь вывод контента

3- Используйте PROC COMPARE.

1007 * т.е. *

***********************************************;
proc content data=table1 out=cont1 noprint;
run;

proc content data=table2 out=cont2 noprint;
run;

proc sort data=cont1; 
  by memname name;
run;

proc sort data=cont2; 
  by memname name;
run;

proc compare listvar
  base=cont1
  compare=cont2;
  id memname name;
run;
******************* END ************;
...