楼主: 小鳄鱼a
2501 7

求助关于文件变量类型长度设定的问题2 [推广有奖]

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

楼主
小鳄鱼a 发表于 2016-4-20 22:56:27 |AI写论文
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 ...
关键词:变量类型 pinggu thread HTML 求助高手 如何

沙发
lyfyb99 在职认证  发表于 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;







藤椅
lyfyb99 在职认证  发表于 2016-4-21 11:07:09
SAS合并时有相同变量名但变量类型不一致是会很麻烦的,能否避免这种情况

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

仅供参考!
已有 1 人评分论坛币 收起 理由
admin_kefu + 20 热心帮助其他会员

总评分: 论坛币 + 20   查看全部评分

板凳
lyfyb99 在职认证  发表于 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;

报纸
lyfyb99 在职认证  发表于 2016-4-21 16:46:47
发了几次都丢失了?

地板
lyfyb99 在职认证  发表于 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;

7
lyfyb99 在职认证  发表于 2016-4-21 17:34:52
发的东西都没出来,只贴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;

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;

8
yzhch2010bsh 发表于 2016-4-22 12:26:18
!!!!厉害!!!!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-27 06:25