全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2430 7
2016-04-20
悬赏 500 个论坛币 已解决
同样一个问题  看来还是有点难度   鉴于yingzi2003   已经帮忙解决了部分问题   所以那个帖子悬赏给他了    但是跑出来有乱码  不晓得如何继续修改   继续求助高手


https://bbs.pinggu.org/thread-4569353-1-1.html

最佳答案

lyfyb99 查看完整内容

根绝你的描述: 提供另一种思路: 先将xls批量转换为SAS data, 存于c:\temp中, 再自动查看dataset中是否包含同名但类型不同的变量(需提前已知变量名),例如已知VAR2, VAR3, VAR4在部分文件中是字符型‘YY-MM-DD' 格式,在另一些文件中是数值型,可用如下程序批量检测是否包含这类变量,如果有,则自动生成数值型 nvar2, nvar3, nvar4,并将原来的变量drop掉。 libname testlib "C:\TEMP"; proc sql; create tabl ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-4-20 22:56:28
根绝你的描述:
孤单的我们 发表于 2016-4-19 16:27
先统一转成相同的格式,再append

几百个文件  还是算了    现在的关键是知道哪几个变量可能类型不一样   但不知道出现在哪个文件


提供另一种思路:
先将xls批量转换为SAS data, 存于c:\temp中, 再自动查看dataset中是否包含同名但类型不同的变量(需提前已知变量名),例如已知VAR2, VAR3, VAR4在部分文件中是字符型‘YY-MM-DD' 格式,在另一些文件中是数值型,可用如下程序批量检测是否包含这类变量,如果有,则自动生成数值型 nvar2, nvar3, nvar4,并将原来的变量drop掉。


libname testlib "C:\TEMP";

proc sql;
create table test01 as
select distinct memname
from sashelp.vcolumn
where libname='TESTLIB';
quit;

data _null_;
set test01 end=eof nobs=count;
call symputx('data'||left(_n_), strip(memname));
if eof then call symput('nobs', left(count));
run;

libname testlib1 "C:\TEMP1";

%macro adjustdata;

%do i=1 %to &nobs;
        data testlib1.&&data&i;
        set testlib.&&data&i;
        
        if varnum(open("testlib.&&data&i", "i"), 'VAR2')>0 then        do;
         if vtype(var2)='C' then nvar2=input(var2, yymmdd10.); else nvar2=var2; drop var2; end;
        
        if varnum(open("testlib.&&data&i", "i"), 'VAR3')>0 then        do;
         if vtype(var3)='C' then nvar3=input(var3, yymmdd10.); else nvar3=var3; drop var3; end;
        
        if varnum(open("testlib.&&data&i", "i"), 'VAR4')>0 then        do;
         if vtype(var4)='C' then nvar4=input(var4, yymmdd10.); else nvar4=var4; drop var4; end;
        
        run;
%mend;


%adjustdata;







二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-21 11:07:09
SAS合并时有相同变量名但变量类型不一致是会很麻烦的,能否避免这种情况

提供一种思路:
在excel转SAS时强行把所有变量转换成字符型,方法很多,例如把excel sheet的第一行粘贴复制成两行,或直接在第一行后插入一行,每个格子里加入足够位数的字符(如!!!!!!!........),这就一并解决了变量长度不一致的问题,这一行对其他的sheet可以快速复制粘贴。在import时加入选项 getnames=yes  mixed=yes, 合并时每个SAS数据集加选项(firstobs=2), 以便去除加入的observation. 合并后再将本应是数值型的变量用input加特定的format 转换成数值型变量。

仅供参考!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-21 16:44:18
根据你的描述: 几百个文件  还是算了    现在的关键是知道哪几个变量可能类型不一样   但不知道出现在哪个文件

提供另一思路:批量检测每个sas dataset 中是否有 那几个变量类型不一致的变量,并将其转换为数值型,例如 VAR2/VAR3/VAR4 三个变量在一些data中是字符型’YY-MM-DD’格式,在另一些data中是数值型。 如果检测到data中有这几个变量的一个或多个,则生成相应的数值型变量nVAR2/nVAR3/nVAR4,并将原变量drop掉。 code 如下:

libname testlib "C:\TEMP";
proc sql;
create table test01 as
select distinct memname
from sashelp.vcolumn
where libname='TESTLIB';
quit;

data _null_;
set test01 end=eof nobs=count;
call symputx('data'||left(_n_), strip(memname));
if eof then call symput('nobs', left(count));
run;

%macro adjustdata;
%do i=1 %to &nobs;
    data &&data&i;
    set testlib.&&data&i;

  /*check if variable var2 exist in dataset and create nvar2 if exist*/
    if varnum(open("testlib.&&data&i", "i"), 'VAR2')>0 then    do;
         if vtype(var2)='C' then nvar2=input(var2, yymmdd10.); else nvar2=var2; drop var2; end;

    if varnum(open("testlib.&&data&i", "i"), 'VAR3')>0 then    do;
         if vtype(var3)='C' then nvar3=input(var3, yymmdd10.); else nvar3=var3; drop var3; end;

    if varnum(open("testlib.&&data&i", "i"), 'VAR4')>0 then    do;
         if vtype(var4)='C' then nvar4=input(var4, yymmdd10.); else nvar4=var4; drop var4; end;

    run;
%mend;
%adjustdata;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-21 16:46:47
发了几次都丢失了?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-4-21 16:54:34
根据你的描述:
孤单的我们 发表于 2016-4-19 16:27
先统一转成相同的格式,再append
几百个文件  还是算了    现在的关键是知道哪几个变量可能类型不一样   但不知道出现在哪个文件

提供另一思路:批量检测每个SAS data中是否有变量类型不一致的日期变量var2, var3, var4, 如果有,检测其实字符型 or 数值型,如果是字符型,转为数值型变量nvar2, nvar3, nvar4,如果是数值型,则将其值赋nvar2, nvar3, nvar4,drop 原来的var2/var3/var4以避免合并时出错。 程序如下:

libname testlib "C:\TEMP";
proc sql;
create table test01 as
select distinct memname
from sashelp.vcolumn
where libname='TESTLIB';
quit;

data _null_;
set test01 end=eof nobs=count;
call symputx('data'||left(_n_), strip(memname));
if eof then call symput('nobs', left(count));
run;

libname testlib1 "C:\TEMP1";

%macro adjustdata;
%do i=1 %to &nobs;
    data testlib1.&&data&i;
    set testlib.&&data&i;
                  /*check if variable var2 exist in dataset*/
    if varnum(open("testlib.&&data&i", "i"), 'VAR2')>0 then    do;
         if vtype(var2)='C' then nvar2=input(var2, yymmdd10.); else nvar2=var2; drop var2; end;

    if varnum(open("testlib.&&data&i", "i"), 'VAR3')>0 then    do;
         if vtype(var3)='C' then nvar3=input(var3, yymmdd10.); else nvar3=var3; drop var3; end;

    if varnum(open("testlib.&&data&i", "i"), 'VAR4')>0 then    do;
         if vtype(var4)='C' then nvar4=input(var4, yymmdd10.); else nvar4=var4; drop var4; end;

    run;
%mend;
%adjustdata;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群