Имя столбца импорта SAS proc имеет знак доллара $

Я импортирую файл с заголовками столбцов, включая знак $ (например, «Продажи $») с импортом proc. Результат импорта, похоже, переименовывает этот столбец во что-то вроде «VAR11».

proc import out = raw
    datafile="example.xlsx" 
    dbms=xlsx replace;
    range = "Sheet1$A1:B50";
    getnames = yes;
run;

Есть ли способ по-прежнему читать имя столбца, но просто отбросить знак $, чтобы он был осмысленным заголовком?


person whyq    schedule 12.02.2018    source источник
comment
Попробуйте это: option VALIDVARNAME=ANY; перед импортом   -  person pinegulf    schedule 12.02.2018
comment
если это только один столбец, который вы можете переименовать, используя out =raw(rename=(var11=newvar))   -  person Kiran    schedule 12.02.2018
comment
К сожалению, @Kiran, этот тип имен переменных появляется около 50 раз, поэтому было бы сложно переименовать одно за другим. Спасибо за мысль!   -  person whyq    schedule 12.02.2018
comment
@pinegulf, это работает! Мне просто нужно будет сослаться на имя переменной как таковое 'Sales $'n (см. Литералы имен SAS)   -  person whyq    schedule 12.02.2018
comment
Я бы посоветовал вам не делать этого. Метки со знаком доллара все еще там, но ввод имени переменной с кавычками и $ очень быстро надоест. Вы можете использовать метки для отчетов и презентаций вместо имен переменных.   -  person Reeza    schedule 12.02.2018


Ответы (1)


Если единственные имена проблем в этом формате, вы сможете прочитать его, а затем переименовать переменную, используя метку. Так что добавьте имена и метки в набор данных. Вы можете запрашивать таблицы словаря, использовать содержимое proc или использовать PROC TRANSPOSE.

proc transpose data=raw (obs=0) out=names ;
  var _all_ ;
run;

Теперь создайте список пар oldname=newname в макропеременную.

proc sql noprint ;
  select catx('=',_name_,translate(trim(compress(_label_,'$')),'_',' '))
    into :renames separated by ' '
  from names
  where upcase(_name_) ne upcase(substrn(_label_,1,32))
  ;
quit;

Затем вы можете использовать это в операторе RENAME или параметре набора данных RENAME=.

data renamed;
  set raw(rename=(&renames)) ;
run;
person Tom    schedule 12.02.2018
comment
Это хороший способ. Но я пробовал ваш код с именем переменной, содержащим более одного _, он удаляет только один из них. Как метка = имя $ хорошо становится имя__ хорошо - person D. O.; 12.02.2018
comment
Вы можете добавить вызов compbl() перед вызовом translate(), чтобы несколько пробелов были сокращены до одного пробела. - person Tom; 12.02.2018
comment
Извините, но повторяются не пробелы, а знак _, который повторяется один два раза. например, если имя переменной Name_____good, как изменить его на Name_good? - person D. O.; 13.02.2018
comment
@ДЕЛАТЬ. Значит, имя начиналось как Name_$_good, а не Name $ good, как вы изначально сказали? Если это так, вам понадобится более сложная логика для замены множественного подчеркивания. Регулярные выражения могут это сделать. Замена символов подчеркивания пробелами с помощью compbl(), а затем перевод пробелов обратно в символы подчеркивания также будут работать. - person Tom; 13.02.2018