在sas eg
中,对于兼容性问题,我需要复制一个表,重命名其列以避免空格和破折号,并使名称大写。
以下是我桌上的名字样本,实际上我还有更多:
- '致电 - 投资IN'
- '电子邮件 - 广告系列'
- '电子邮件 - 投资OUT'
- '信 - 活动'
我想摆脱破折号和空格并将名称设为大写,这些将是我输出的列:
- 'CALL_INVESTMENTS_IN'
- 'E_MAIL_CAMPAIGN'
- 'E_MAIL_INVESTMENTS_OUT'
- 'LETTER_CAMPAIGN'
编辑:
要清楚,我的输入是一个表,我的输出应该是新表,我不想键入或复制粘贴单个列名,我希望对所有列名完成操作(我可能必须在我从外部来源收到的许多表的许多列上使用它。)
我应该使用什么sql查询(或sas宏)?
答案 0 :(得分:3)
只需使用RENAME语句或RENAME = dataset选项即可。如果列表不太长,您可以轻松地将所需的old=new
对生成到宏变量中。为了确保您可以更改大小写,最好使用数据集选项,因为之前只有一个问题显示RENAME upper = UPPER在DATA步骤中什么都不做,因为SAS根据首次看到的方式设置名称的大小写。
proc contents data=have noprint out=contents ; run;
proc sql noprint;
select catx('=',nliteral(name),upcase(translate(trim(name),'__','- ')))
into :rename separated by ' '
from contents
;
quit;
data want ;
set have (rename=(&rename)) ;
run;
答案 1 :(得分:2)
使用正则表达式并将空格字符(\s
或)或短划线
-
的子字符串替换为单个下划线:
SELECT UPPER( REGEXP_REPLACE( table_name, '(\s|-)+', '_' ) )
FROM your_list_of_tables
答案 2 :(得分:2)
首先执行proc contents
并使用out
选项将列名输出到表中。列名称应该是您想要的列,varnum保持列的位置。然后使用tranwrd
功能将-
替换为_
并使用upcase
功能将所有文字设为大写 -
newcol = upcase(tranwrd(varname, '-', '_'))
在此表上使用proc sql
into
子句创建var列表。使用新的var名称创建新表并设置旧表。
\\//
答案 3 :(得分:0)
/ *
如何让宏对您想要的任何表进行操作:)。让我知道这是否适合您:)
简介:重命名宏
此宏将重命名指定数据集的列,以符合标准数据库列命名规范。 它将执行以下操作:
1)用下划线替换所有空格 2)将'+'替换为'_plus' 3)用下划线替换“-” 4)将其他任何特殊字符替换为空白'' 5)将新数据集保存到指定的目标数据和库名称中
语法-
%Renamer_macro(source_lib,source_data,target_lib,target_data);
* /
options spool;
options mprint;
options mlogic;
%macro Renamer_macro(source_lib,source_data,target_lib,target_data);
%local names;
%Local sp_chars;
%Let sp_chars = ~’°-!()®@#$%^&©+=\/|[]}{]{?><‘—…... ;
Data &target_lib..&target_data.;
set &source_lib..&source_data.;
run;
proc sql noprint;
select catx('=',cats(cats(cats("'",name),"'"),"n"),
cats(compress(translate(tranwrd(tranwrd(tranwrd(trim(name),"-","_"),"
","_"),"+","_plus"),"","&sp_chars"))))
into :names separated by ' '
from sashelp.vcolumn
where libname= "%upcase(&source_lib)" and memname= "%upcase(&source_data)";
%put &names;
/*and upcase(substr(name,1,2))='DX';*/
proc datasets lib= &target_lib.;
modify &target_data.;
rename &names;
quit;
%mend;