Skip to content

Commit

Permalink
perf(qualify, quantify) 优化传参方式
Browse files Browse the repository at this point in the history
优化 LABEL,INDENT,SUFFIX 的传参方式,更符合一般习惯。
  • Loading branch information
Snoopy1866 committed Mar 19, 2024
1 parent 537306a commit cae34d9
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 258 deletions.
27 changes: 3 additions & 24 deletions docs/qualify/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -284,17 +284,12 @@ STAT_FORMAT = (#RATE = qual., #TS = 8.4, #P = pv.)

**Syntax** : _string_

指定输出结果中第一行显示的标签,以下三种传参方式都是可接受的:

- `LABEL = "`_`string`_`"`
- `LABEL = '`_`string`_`'`
- `LABEL = `_`string`_
指定输出结果中第一行显示的标签字符串,该字符串必须使用匹配的单(双)引号包围。

如果指定的 `LABEL` 中含有不匹配的引号,例如,需要指定 `LABEL` 为一个单引号,可以选择以下传参方式:

```sas
LABEL = "'"
LABEL = %str(%')
```

但不能使用以下传参方式:
Expand All @@ -303,8 +298,6 @@ LABEL = %str(%')
LABEL = ''''
```

⚠ 尽管在一般情况下,由单引号包围的字符串中,连续两个单引号被视为一个单引号,但在本宏程序中,由于技术限制,连续两个单引号仍然被视为两个单引号;同理,在由双引号包围的字符串中,连续两个双引号仍然被视为两个双引号。

**Default** : #AUTO

默认情况下,宏程序将自动获取变量 [VAR](#var) 的标签,若标签为空,则使用变量 [VAR](#var) 的变量名作为标签。
Expand All @@ -321,17 +314,12 @@ LABEL = "性别-n(%)"

**Syntax** : _string_

指定输出结果各分类的缩进字符串,以下三种传参方式都是可接受的:

- `INDENT = "`_`string`_`"`
- `INDENT = '`_`string`_`'`
- `INDENT = `_`string`_
指定输出结果各分类的缩进字符串,该字符串必须使用匹配的单(双)引号包围。

如果指定的 `INDENT` 中含有不匹配的引号,例如,需要指定 `INDENT` 为一个单引号,可以选择以下传参方式:

```sas
INDENT = "'"
INDENT = %str(%')
```

但不能使用以下传参方式:
Expand All @@ -340,8 +328,6 @@ INDENT = %str(%')
INDENT = ''''
```

⚠ 尽管在一般情况下,由单引号包围的字符串中,连续两个单引号被视为一个单引号,但在本宏程序中,由于技术限制,连续两个单引号仍然被视为两个单引号;同理,在由双引号包围的字符串中,连续两个双引号仍然被视为两个双引号。

**Default** : #AUTO

默认情况下,各分类前使用 4 个英文空格作为缩进字符。
Expand All @@ -362,17 +348,12 @@ INDENT = "\li420 "

**Syntax** : _string_

指定输出结果各分类名称的后缀,以下三种传参方式都是可接受的:

- `SUFFIX = "`_`string`_`"`
- `SUFFIX = '`_`string`_`'`
- `SUFFIX = `_`string`_
指定输出结果各分类名称的后缀,该字符串必须使用匹配的单(双)引号包围。

如果指定的 `SUFFIX` 中含有不匹配的引号,例如,需要指定 `SUFFIX` 为一个单引号,可以选择以下传参方式:

```sas
SUFFIX = "'"
SUFFIX = %str(%')
```

但不能使用以下传参方式:
Expand All @@ -381,8 +362,6 @@ SUFFIX = %str(%')
SUFFIX = ''''
```

⚠ 尽管在一般情况下,由单引号包围的字符串中,连续两个单引号被视为一个单引号,但在本宏程序中,由于技术限制,连续两个单引号仍然被视为两个单引号;同理,在由双引号包围的字符串中,连续两个双引号仍然被视为两个双引号。

**Default** : #AUTO

默认情况下,各分类名称不添加后缀。
Expand Down
18 changes: 2 additions & 16 deletions docs/quantify/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -332,17 +332,12 @@ STAT_NOTE = (#N = "靶区数", #MEAN = "平均值")

**Syntax** : _string_

指定输出结果中第一行显示的标签,以下三种传参方式都是可接受的:

- `LABEL = "`_`string`_`"`
- `LABEL = '`_`string`_`'`
- `LABEL = `_`string`_
指定输出结果中第一行显示的标签字符串,该字符串必须使用匹配的单(双)引号包围。

如果指定的 `LABEL` 中含有不匹配的引号,例如,需要指定 `LABEL` 为一个单引号,可以选择以下传参方式:

```sas
LABEL = "'"
LABEL = %str(%')
```

但不能使用以下传参方式:
Expand All @@ -351,8 +346,6 @@ LABEL = %str(%')
LABEL = ''''
```

⚠ 尽管在一般情况下,由单引号包围的字符串中,连续两个单引号被视为一个单引号,但在本宏程序中,由于技术限制,连续两个单引号仍然被视为两个单引号;同理,在由双引号包围的字符串中,连续两个双引号仍然被视为两个双引号。

**Default** : #AUTO

默认情况下,宏程序将自动获取变量 `VAR` 的标签,若标签为空,则使用变量 `VAR` 的变量名作为标签。
Expand All @@ -369,17 +362,12 @@ LABEL = "年龄(岁)"

**Syntax** : _string_

指定输出结果各分类的缩进字符串,以下三种传参方式都是可接受的:

- `INDENT = "`_`string`_`"`
- `INDENT = '`_`string`_`'`
- `INDENT = `_`string`_
指定输出结果各分类的缩进字符串,该字符串必须使用匹配的单(双)引号包围。

如果指定的 `INDENT` 中含有不匹配的引号,例如,需要指定 `INDENT` 为一个单引号,可以选择以下传参方式:

```sas
INDENT = "'"
INDENT = %str(%')
```

但不能使用以下传参方式:
Expand All @@ -388,8 +376,6 @@ INDENT = %str(%')
INDENT = ''''
```

⚠ 尽管在一般情况下,由单引号包围的字符串中,连续两个单引号被视为一个单引号,但在本宏程序中,由于技术限制,连续两个单引号仍然被视为两个单引号;同理,在由双引号包围的字符串中,连续两个双引号仍然被视为两个双引号。

**Default** : #AUTO

默认情况下,各分类前使用 4 个英文空格作为缩进字符。
Expand Down
103 changes: 37 additions & 66 deletions gbk/qualify.sas
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Version Date: 2023-03-08 1.0.1
2024-01-22 1.0.9
2024-01-23 1.0.10
2024-03-15 1.0.11
2024-03-19 1.0.12
===================================
*/

Expand Down Expand Up @@ -455,93 +456,63 @@ Version Date: 2023-03-08 1.0.1


/*LABEL*/
%if %bquote(&label) = %bquote() %then %do;
%let label_sql_expr = %bquote();
%if %superq(label) = %bquote() %then %do;
%let label_sql_expr = %bquote('');
%end;
%else %if %bquote(%upcase(&label)) = #AUTO %then %do;
%else %if %qupcase(&label) = #AUTO %then %do;
proc sql noprint;
select
(case when label ^= "" then cats(label)
else cats(name, "-n(%)") end)
(case when label ^= "" then cats("'", label, "'")
else cats("'", name, "-n(%)", "'") end)
into: label_sql_expr from DICTIONARY.COLUMNS where libname = "&libname_in" and memname = "&memname_in" and upcase(name) = "&var_name";
quit;
%end;
%else %do;
%let reg_label_id = %sysfunc(prxparse(%bquote(/^(?:\x22([^\x22]*)\x22|\x27([^\x27]*)\x27|(.*))$/)));
%let reg_label_id = %sysfunc(prxparse(%bquote(/^(\x22[^\x22]*\x22|\x27[^\x27]*\x27)$/)));
%if %sysfunc(prxmatch(&reg_label_id, %superq(label))) %then %do;
%let label_pos_1 = %bquote(%sysfunc(prxposn(&reg_label_id, 1, %superq(label))));
%let label_pos_2 = %bquote(%sysfunc(prxposn(&reg_label_id, 2, %superq(label))));
%let label_pos_3 = %bquote(%sysfunc(prxposn(&reg_label_id, 3, %superq(label))));
%if %superq(label_pos_1) ^= %bquote() %then %do;
%let label_sql_expr = %superq(label_pos_1);
%end;
%else %if %superq(label_pos_2) ^= %bquote() %then %do;
%let label_sql_expr = %superq(label_pos_2);
%end;
%else %if %superq(label_pos_3) ^= %bquote() %then %do;
%let label_sql_expr = %superq(label_pos_3);
%end;
%else %do;
%let label_sql_expr = %bquote();
%end;
%let label_sql_expr = %superq(label);
%end;
%else %do;
%put ERROR: 参数 LABEL 格式不正确,指定的字符串必须使用匹配的引号包围!;
%goto exit;
%end;
%end;


/*INDENT*/
%if %bquote(&indent) = %bquote() %then %do;
%let indent_sql_expr = %bquote();
%if %superq(indent) = %bquote() %then %do;
%let indent_sql_expr = %bquote('');
%end;
%else %if %bquote(%upcase(&indent)) = #AUTO %then %do;
%let indent_sql_expr = %bquote( );
%else %if %qupcase(&indent) = #AUTO %then %do;
%let indent_sql_expr = %bquote(' ');
%end;
%else %do;
%let reg_indent_id = %sysfunc(prxparse(%bquote(/^(?:\x22([^\x22]*)\x22|\x27([^\x27]*)\x27|(.*))$/)));
%let reg_indent_id = %sysfunc(prxparse(%bquote(/^(\x22[^\x22]*\x22|\x27[^\x27]*\x27)$/)));
%if %sysfunc(prxmatch(&reg_indent_id, %superq(indent))) %then %do;
%let indent_pos_1 = %bquote(%sysfunc(prxposn(&reg_indent_id, 1, %superq(indent))));
%let indent_pos_2 = %bquote(%sysfunc(prxposn(&reg_indent_id, 2, %superq(indent))));
%let indent_pos_3 = %bquote(%sysfunc(prxposn(&reg_indent_id, 3, %superq(indent))));
%if %superq(indent_pos_1) ^= %bquote() %then %do;
%let indent_sql_expr = %superq(indent_pos_1);
%end;
%else %if %superq(indent_pos_2) ^= %bquote() %then %do;
%let indent_sql_expr = %superq(indent_pos_2);
%end;
%else %if %superq(indent_pos_3) ^= %bquote() %then %do;
%let indent_sql_expr = %superq(indent_pos_3);
%end;
%else %do;
%let indent_sql_expr = %bquote();
%end;
%let indent_sql_expr = %superq(indent);
%end;
%else %do;
%put ERROR: 参数 INDENT 格式不正确,指定的字符串必须使用匹配的引号包围!;
%goto exit;
%end;
%end;


/*SUFFIX*/
%if %bquote(&suffix) = %bquote() %then %do;
%let suffix_sql_expr = %bquote();
%if %superq(suffix) = %bquote() %then %do;
%let suffix_sql_expr = %bquote('');
%end;
%else %if %bquote(%upcase(&suffix)) = #AUTO %then %do;
%let suffix_sql_expr = %bquote( );
%else %if %qupcase(&suffix) = #AUTO %then %do;
%let suffix_sql_expr = %bquote(' ');
%end;
%else %do;
%let reg_suffix_id = %sysfunc(prxparse(%bquote(/^(?:\x22([^\x22]*)\x22|\x27([^\x27]*)\x27|(.*))$/)));
%let reg_suffix_id = %sysfunc(prxparse(%bquote(/^(\x22[^\x22]*\x22|\x27[^\x27]*\x27)$/)));
%if %sysfunc(prxmatch(&reg_suffix_id, %superq(suffix))) %then %do;
%let suffix_pos_1 = %bquote(%sysfunc(prxposn(&reg_suffix_id, 1, %superq(suffix))));
%let suffix_pos_2 = %bquote(%sysfunc(prxposn(&reg_suffix_id, 2, %superq(suffix))));
%let suffix_pos_3 = %bquote(%sysfunc(prxposn(&reg_suffix_id, 3, %superq(suffix))));
%if %superq(suffix_pos_1) ^= %bquote() %then %do;
%let suffix_sql_expr = %superq(suffix_pos_1);
%end;
%else %if %superq(suffix_pos_2) ^= %bquote() %then %do;
%let suffix_sql_expr = %superq(suffix_pos_2);
%end;
%else %if %superq(suffix_pos_3) ^= %bquote() %then %do;
%let suffix_sql_expr = %superq(suffix_pos_3);
%end;
%else %do;
%let suffix_sql_expr = %bquote();
%end;
%let suffix_sql_expr = %superq(suffix);
%end;
%else %do;
%put ERROR: 参数 SUFFIX 格式不正确,指定的字符串必须使用匹配的引号包围!;
%goto exit;
%end;
%end;

Expand All @@ -563,17 +534,17 @@ Version Date: 2023-03-08 1.0.1
proc sql noprint;
create table tmp_qualify_outdata as
select
0 as SEQ,
%sysfunc(quote(&label_sql_expr)) as ITEM,
"" as VALUE
0 as SEQ,
%unquote(%superq(label_sql_expr)) as ITEM,
"" as VALUE
from tmp_qualify_indata(firstobs = 1 obs = 1)
%do i = 1 %to &var_level_n;
outer union corr
select
&i as SEQ,
cat(%sysfunc(quote(&indent_sql_expr)),
cat(%unquote(%superq(indent_sql_expr)),
%unquote(&&var_level_&i._note),
%sysfunc(quote(&suffix_sql_expr))) as ITEM,
%unquote(%superq(suffix_sql_expr))) as ITEM,
sum(&var_name = &&var_level_&i) as N,
strip(put(calculated N, &N_format)) as N_FMT,
sum(&var_name = &&var_level_&i)/count(*) as RATE,
Expand Down
Loading

0 comments on commit cae34d9

Please sign in to comment.