楼主: dxystata
4996 11

输出格式名无效 [推广有奖]

版主

大师

34%

还不是VIP/贵宾

-

TA的文库  其他...

Software

中英文Ebook

R学习

威望
2
论坛币
182304 个
通用积分
15205.6031
学术水平
208 点
热心指数
271 点
信用等级
174 点
经验
291087 点
帖子
5375
精华
1
在线时间
13478 小时
注册时间
2006-6-21
最后登录
2024-4-25

初级学术勋章 初级热心勋章 中级热心勋章 初级信用勋章

50论坛币
  1. proc import
  2.   OUT = WORK.a
  3.   DATAFILE = "F:\Book2.xls"
  4.   DBMS = EXCEL REPLACE;
  5.   Sheet = "Sheet1";
  6. run;

  7. proc sql noprint;
  8.                 select Value into:gcsex from a where lower(Key) = "gcsex";
  9. quit;

  10. data aaa;
  11. input no name$;
  12. cards;
  13. 1 f
  14. 2 m
  15. ;
  16. run;

  17. %macro aaa;
  18. data fmt;
  19.         set aaa;
  20.         retain fmtname "&gcsex.f";
  21.         rename no=start name=label;
  22. run;
  23. proc format cntlin=fmt;
  24. run;
  25. %mend;
  26. %aaa;
复制代码


运行后出现
2014-11-15_174015.jpg

如何解决?谢谢!

Book2.xls (15.5 KB)




最佳答案

pobel 查看完整内容

1. SQL 后去掉空格: 加一句 %let gcsex=&gcsex; 2. retain那句去除空格 retain fmtname "%trim(&gcsex.)f";
关键词:输出格式 proc sql fmtname replace import import EXCEL where start

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 2014-11-15 17:42:27 |只看作者 |坛友微信交流群
dxystata 发表于 2014-11-17 13:52
使用strip无效!
1. SQL 后去掉空格:
  加一句 %let gcsex=&gcsex;

2. retain那句去除空格
        retain fmtname "%trim(&gcsex.)f";

使用道具

藤椅
sniperhgy 发表于 2014-11-15 20:11:01 |只看作者 |坛友微信交流群
楼主看到log里面SEX和F之间有很大的空格吗?楼主的本意是生成一个变量fmtname,值为SEXF,作为格式的名字,但是格式的名字里面不能有空格的存在,那些空格估计是因为生成宏变量gcsex时留下的,所以做法有两种:
1. select strip(Value) into :gcsex
2.直接对“&gcsex.f”进行处理,处理方法就是用tranwrd或者compress函数对空格进行替换,具体的,楼主先自己试试看,实在不行,我会给出代码。
已有 2 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 3 + 3 观点有启发
jingju11 + 5 非常精彩

总评分: 经验 + 100  学术水平 + 8  热心指数 + 3   查看全部评分

使用道具

板凳
dxystata 发表于 2014-11-17 13:52:25 |只看作者 |坛友微信交流群
sniperhgy 发表于 2014-11-15 20:11
楼主看到log里面SEX和F之间有很大的空格吗?楼主的本意是生成一个变量fmtname,值为SEXF,作为格式的名字, ...
使用strip无效!

使用道具

报纸
dxystata 发表于 2014-11-17 15:56:43 |只看作者 |坛友微信交流群
pobel 发表于 2014-11-17 15:42
1. SQL 后去掉空格:
  加一句 %let gcsex=&gcsex;
为什么sql后会有空格呢?谢谢!

使用道具

地板
pobel 在职认证  发表于 2014-11-17 16:15:01 |只看作者 |坛友微信交流群
dxystata 发表于 2014-11-17 15:56
为什么sql后会有空格呢?谢谢!
1. 首先,如果SELECT出的值前后有空格,SQL INTO创建宏变量过程中不会去掉前后的空格。
2. (猜测)用SQL INTO创建的宏变量的长度似乎取决与SELECT的变量长度。
例如,如果变量value的长度是8,那INTO做的宏变量gcsex的值也会是8位。
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 100 + 5 + 5 观点有启发

总评分: 经验 + 100  学术水平 + 5  热心指数 + 5   查看全部评分

使用道具

7
dxystata 发表于 2014-11-18 07:51:00 |只看作者 |坛友微信交流群
pobel 发表于 2014-11-17 16:15
1. 首先,如果SELECT出的值前后有空格,SQL INTO创建宏变量过程中不会去掉前后的空格。
2. (猜测)用SQ ...
proc sql noprint;
   select Value into:gcsex from a where lower(Key) = "gcsex";
quit;

%put %length(&gcsex);

结果是3。

使用道具

8
dxystata 发表于 2014-11-18 07:53:45 |只看作者 |坛友微信交流群
pobel 发表于 2014-11-17 16:15
1. 首先,如果SELECT出的值前后有空格,SQL INTO创建宏变量过程中不会去掉前后的空格。
2. (猜测)用SQ ...
proc sql noprint;
   select Value into:gcsex from a where lower(Key) = "gcsex";
quit;

%put %length(&gcsex);

结果是3。

使用道具

9
pobel 在职认证  发表于 2014-11-18 08:12:26 |只看作者 |坛友微信交流群
dxystata 发表于 2014-11-18 07:53
proc sql noprint;
   select Value into:gcsex from a where lower(Key) = "gcsex";
quit;
%length的结果是3并不能说明gcsex的值不包含空格。

%put %length(*&gcsex*);
已有 1 人评分经验 学术水平 热心指数 收起 理由
dxystata + 50 + 3 + 3 精彩帖子

总评分: 经验 + 50  学术水平 + 3  热心指数 + 3   查看全部评分

使用道具

10
yongyitian 发表于 2014-11-18 08:52:51 |只看作者 |坛友微信交流群
  1. proc sql noprint;
  2.    select compress(Value)||'F' into:gcsex from a where lower(Key) = "gcsex";
  3. quit;

  4. /* or   */
  5. %symdel gcsex;        /* delete the macro variable */
  6. proc sql noprint;
  7.     select trim(Value)||'f' into:gcsex from a where lower(Key) = "gcsex";
  8. quit;

  9. /* then */
  10. data fmt;
  11.     set aaa;
  12.     retain fmtname "&gcsex";
  13.     rename no=start name=label;
  14. run;
复制代码

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 16:49