全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2394 10
2012-11-24
悬赏 200 个论坛币 已解决
%MACRO AAA;
    %LET HEAD=组别\N\疗前-疗后<DBar±SD 95%CI>\组内比较<统计量P>\两组差值^n均数之差(95%CI)\组间比较<统计量 P>;
%LET Head=%Sysfunc(Trim(&Head.));
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead= %SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\))));
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;
%AAA;

/*下面的程序如何实现和AAA的结果相同,不出现Warning*/
/* 不同之处是上面是中文状态下的%和(),我希望是英文状态下得%和(),如何对下面的程序进行修改 */
%MACRO AddTitleHeadInitContent();
%GLOBAL
gcTitleHeadB2
gcTitleHeadC2
gnCILevel
;
%let gnCILevel=95;
%LET gcTitleHeadB2=%QUOTE(
   指标\条件\组别\缺失\n\Mean±SD\&gnCILevel.%nrstr(%%)CI\M(Q1~Q3)\Min~Max\统计量\P,
   );
%LET gcTitleHeadC2=%QUOTE(
  时间\中心\组别\n\疗前-疗后<DBar±SD &gnCILevel.%nrstr(%%)CI>\组内比较<统计量 P>\两组差值^n均数之差(&gnCILevel.%nrstr(%%)CI)\组间比较<统计量 P>,
  );
%mend;
%AddTitleHeadInitContent();

%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%Sysfunc(Trim(&Head.));
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead= %SYSFUNC(TRIM(%QSCAN(%QUOTE(&Head.),&I.,%STR(\))));
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;
%bbb;


二维码

扫码加我 拉你入群

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

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

全部回复
2012-11-24 10:35:36
复制代码
二维码

扫码加我 拉你入群

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

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

2012-11-24 14:13:47
%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%nrbquote(%Sysfunc(Trim(%nrstr(&Head.)))); /原来有两个陷阱啊/
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead=%nrbquote( %SYSFUNC(TRIM(%QSCAN(&Head.,&I.,%STR(\))))); /*问题出在哪儿????? */
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;

%bbb( );

这个有点BUG.楼上的可用。
二维码

扫码加我 拉你入群

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

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

2012-11-24 14:42:56
webgu 发表于 2012-11-24 14:13
这个有点BUG.楼上的可用。
QSCAN()改得很巧妙。原来罪魁祸首在此。
为什么用了DATA步函数TRIM后就出问题?
二维码

扫码加我 拉你入群

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

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

2012-11-24 15:59:30
webgu 发表于 2012-11-24 14:13
%MACRO bbb(head=&gcTitleHeadB2);
%LET Head=%nrbquote(%Sysfunc(Trim(%nrstr(&Head.)))); /*原来有两个陷阱啊*/
%PUT &HEAD;
%LET I=1;
%LET Head1List=;
%LET Head1Position=;
%LET Head2List=;
%LET Head2Position=;
%DO %WHILE (%QSCAN(%QUOTE(&Head.),&I.,%STR(\)) NE %STR());
  %LET MainHead=%nrbquote( %SYSFUNC(TRIM(%QSCAN(&Head.,&I.,%STR(\))))); /*问题出在哪儿????? */
         %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
            %PUT &MainHead;
   %IF %INDEX(%QUOTE(&MainHead.),%STR(>) ) EQ 0 %Then %DO;
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
   %ELSE %DO;
    %LET J= %INDEX(%QUOTE(&MainHead.),%STR(<) );
    %LET MainHead=%SUBSTR(&MainHead.,1,%EVAL(&J-1));
    %LET Head1List=%STR(&head1List.,&MainHead.);
   %END;
  %LET I=%EVAL(&I.+1);
%END;
%LET Head1List=%QSUBSTR(%QUOTE(&Head1List.),2);
    %PUT "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
%PUT &Head1List;
%MEND;

%bbb( );
还是有点问题,WARNING: 没有解析宏 CI 的调用。
二维码

扫码加我 拉你入群

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

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

2012-11-24 16:42:53
dxystata 发表于 2012-11-24 15:59
还是有点问题,WARNING: 没有解析宏 CI 的调用。
嗯,蓝色部分代码问题,我没有figure it out。二楼的代码可以用。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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