Вставить (существующие внутри) заголовки столбцов как первую строку в таблицу - PullRequest
0 голосов
/ 09 июля 2020

Предположим, что у нас есть таблица INPUT_TABLE, которая имеет четыре столбца name, lat, lon и z, заполненных множеством наборов данных. В SAS Explorer это будет, например, выглядеть так:

   name    lat        lon        z 
1  Germany 49.420469  8.7269178  17
2  England 51.5540693 -0.8249039 16
...

Я передаю PREPROCESSED_TABLE на основе этого INPUT_TABLE макросу %tabl:

data V42.PREPROCESSED_TABLE;
   set V21.INPUT_TABLE;
   drop NAME;
run;

%tabl(libin=V42, file=PREPROCESSED_TABLE);

Сам макрос мне не разрешено изменять.

Помимо прочего, %tabl также записывает простой текстовый файл PREPROCESSED_TABLE.txt:

49.420469|8.7269178|17
51.5540693|-0.8249039|16

Я хотел бы также должны быть записаны имена заголовков, например:

lat|lon|z
49.420469|8.7269178|17
51.5540693|-0.8249039|16

Моя идея состоит в том, чтобы развернуть PREPROCESSED_TABLE где-нибудь на шаге data - может ли кто-нибудь помочь мне с этим, пожалуйста? Как я могу прочитать имена заголовков, которые хранятся внутри?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Если цель состоит в том, чтобы создать файл с одной строкой с именами переменных, тогда просто напишите файл самостоятельно. Сначала введите имена в набор данных (по порядку), а затем запишите их. Например, вы можете использовать PRO C TRANSPOSE с опцией набора данных OBS = 0 для создания файла с одним наблюдением для каждой переменной.

 proc transpose data=V42.PREPROCESSED_TABLE(obs=0) out=NAMES ;
   var _all_ ;
 run;

Который затем можно использовать для записи в файл.

 data _null_;
   set names ;
   file 'preprocessed.txt' dsd dlm='|';
   put _name_ @ ;
 run;

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

data _null_;
  set V42.PREPROCESSED_TABLE;
  file 'preprocessed.txt' dsd dlm='|' mod;
  put (_all_) (+0);
run;

Если вам нужно вызвать существующий макрос по другим причинам, вы можете либо проигнорировать файл, который он создает . Или, если по какой-то причине содержимое отличается от простого дампа файла, вы можете просто объединить файл с заголовками с файлом, который генерирует макрос. Скажем, макрос сгенерировал PREPROCESSED_TABLE.txt, а ваш код сгенерировал однострочный файл headers.txt. Затем этот шаг будет читать оба и писать PREPROCESSED_TABLE_w_headers.txt;

data _null_;
  file 'PREPROCESSED_TABLE_w_headers.txt';
  if _n_=1 then do;
    infile 'headers.txt';
    input;
    put _infile_;
  end;
  infile 'PREPROCESSED_TABLE.txt';
  input;
  put _infile_;
run;
0 голосов
/ 09 июля 2020

Учитывая подсказки Reeza и Tom , я сам придумал обходной путь: мы просто вызываем макрос %tabl дважды, один раз с таблицей с одной строкой с именами столбцов и один раз с данными. Этот подход по существу соответствует прикреплению к файлу сначала заголовков, а затем данных к файлу (за исключением того, что мне нужно беспокоиться о дополнительных вещах, добавленных %tabl ниже по цепочке процессов).

Технические Трудность, с которой я столкнулся, заключалась в том, как извлечь эту таблицу с одной строкой с именами столбцов из метаинформации таблицы ввода таблицы V21.INPUT_TABLE.

Мой товарищ по команде показал мне, как это делается. Чтобы сделать его тестируемым для всех, я покажу этот шаг для таблицы тестовых данных sashelp.class:

proc contents data=sashelp.class out=meta (keep=NAME VARNUM) noprint;
run;

proc sort data=meta out=meta2;
by VARNUM;
run;

proc transpose data=meta2 out=colheaders (drop=_NAME_ _LABEL_);
var name;
run;

В результате у нас будет таблица colheaders с ровно одной строкой, содержащей заголовки таблиц. , отсортированные по VARNUM, что является порядком их появления в исходной таблице:

   COL1  COL2  COL3  COL4    COL5
1  NAME  SEX   AGE   HEIGHT  WEIGHT

Проблема решена, по крайней мере теоретически.

...