用下划线替换破折号和空格,并使列名称为大写

时间:2017-09-28 09:13:31

标签: sql oracle sas

sas eg中,对于兼容性问题,我需要复制一个表,重命名其列以避免空格和破折号,并使名称大写。

以下是我桌上的名字样本,实际上我还有更多:

  
      
  • '致电 - 投资IN'
  •   
  • '电子邮件 - 广告系列'
  •   
  • '电子邮件 - 投资OUT'
  •   
  • '信 - 活动'
  •   

我想摆脱破折号和空格并将名称设为大写,这些将是我输出的列:

  
      
  • 'CALL_INVESTMENTS_IN'
  •   
  • 'E_MAIL_CAMPAIGN'
  •   
  • 'E_MAIL_INVESTMENTS_OUT'
  •   
  • 'LETTER_CAMPAIGN'
  •   

编辑:

要清楚,我的输入是一个表,我的输出应该是新表,我不想键入或复制粘贴单个列名,我希望对所有列名完成操作(我可能必须在我从外部来源收到的许多表的许多列上使用它。)

我应该使用什么sql查询(或sas宏)?

4 个答案:

答案 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;
相关问题