使用PRXCHANGE重命名变量导致变量名末尾发生过多替换
Use of PRXCHANGE to rename variables causes excessive replacement to happen at the end of the variable name
我是 SAS 的新手,我目前正在尝试创建一个宏,它会自动用下划线替换变量名称中的任何特殊字符。我目前正在使用 PRXCHANGE 执行替换,但我注意到当变量被重命名时,新变量名称的末尾有额外的下划线。
Suppose we were to have two variables "dummy?" and "te!st". When I perform the replacement, the new variables are "dummy___________________________" and " te_st___________________________". When the replacement should just be "dummy_" and "te_st", respectively.
在下面的示例代码中,我知道如果我在 PRXCHANGE 函数中添加“TRIM(name)”,那么就不会发生任何额外的替换。这样做的问题是,如果我有一个名为“example!”的变量,并以 space 作为最后一个字符,那么我希望将该变量重命名为“example__”,最后有两个下划线。然而,通过使用 TRIM(name),我会得到带有单个下划线的“example_”。
N.B。我知道如果我将 SAS 变量名称策略更改为 V7,那么这将不是问题。我这样做只是为了提高我的 SAS 技能。
/* Generate dummy data */
option validvarname = any;
data dummy_data;
input "dummy?"n "te!st"n;
datalines;
1 1
2 2
3 3
;
run;
/* Generate variables with the old and new variable names as entries */
data test (keep = name new_name);
set sashelp.vcolumn;
where libname = "WORK" and memname = "DUMMY_DATA";
new_name = prxchange("s/[^a-zA-Z0-9]/_/", -1, name);
run;
您的问题是 SAS 如何填充字符串可变长度。虽然大多数语言都有可变长度的字符串,但 SAS 更类似于 SQL char
类型,没有伴随的 varchar
类型。由于可预测的行大小,这在某些方面为 SAS 提供了非常好的性能,但也有一些后果。请注意,您实际上可以使用 options compress
在数据集上有效地获取可变长度字符串,但在数据步骤中数据集是未压缩的。
在 SAS 中,分配 "A"
的长度为 10 的字符串实际上将具有值 "A "
。 A、加上9spaces。不是空字符,实际 space 个字符。这通常无关紧要,因为 SAS 以多种方式编写以忽略那些尾随的 space(因此 "A" = "A " = "A "
),但在这种特殊情况下它确实很重要(因为你正在转换 space字符).
您可以使用 trim
函数在 执行期间删除 spaces ,尽管它仍将与 space 一起存储当然是之后了。
new_name = prxchange("s/[^a-zA-Z0-9]/_/", -1, trim(name));
请注意 trim
不能 return 空值,它将 总是 return 单个 space,所以如果这是有可能的,您应该将其包装在 missing
的检查中(一个只有 spaces = 缺失的字符串变量)。
if not missing(name) then do;
new_name = prxchange("s/[^a-zA-Z0-9]/_/", -1, trim(name));
end;
else new_name = ' ';
有一个 trimn
函数可以 return 长度为 0 的字符串,但如果缺少它,则没有理由执行 prxchange - 这将节省时间。
您担心变量名称的尾随空格无效。变量名的尾随空格并不重要。此数据步骤仅创建一个变量。
376 options validvarname=any;
377 data test;
378 'xxx'n = 1;
379 'xxx 'n= 2;
380 run;
NOTE: The data set WORK.TEST has 1 observations and 1 variables.
NOTE: DATA statement used (Total process time):
real time 0.07 seconds
cpu time 0.03 seconds
我是 SAS 的新手,我目前正在尝试创建一个宏,它会自动用下划线替换变量名称中的任何特殊字符。我目前正在使用 PRXCHANGE 执行替换,但我注意到当变量被重命名时,新变量名称的末尾有额外的下划线。
Suppose we were to have two variables "dummy?" and "te!st". When I perform the replacement, the new variables are "dummy___________________________" and " te_st___________________________". When the replacement should just be "dummy_" and "te_st", respectively.
在下面的示例代码中,我知道如果我在 PRXCHANGE 函数中添加“TRIM(name)”,那么就不会发生任何额外的替换。这样做的问题是,如果我有一个名为“example!”的变量,并以 space 作为最后一个字符,那么我希望将该变量重命名为“example__”,最后有两个下划线。然而,通过使用 TRIM(name),我会得到带有单个下划线的“example_”。
N.B。我知道如果我将 SAS 变量名称策略更改为 V7,那么这将不是问题。我这样做只是为了提高我的 SAS 技能。
/* Generate dummy data */
option validvarname = any;
data dummy_data;
input "dummy?"n "te!st"n;
datalines;
1 1
2 2
3 3
;
run;
/* Generate variables with the old and new variable names as entries */
data test (keep = name new_name);
set sashelp.vcolumn;
where libname = "WORK" and memname = "DUMMY_DATA";
new_name = prxchange("s/[^a-zA-Z0-9]/_/", -1, name);
run;
您的问题是 SAS 如何填充字符串可变长度。虽然大多数语言都有可变长度的字符串,但 SAS 更类似于 SQL char
类型,没有伴随的 varchar
类型。由于可预测的行大小,这在某些方面为 SAS 提供了非常好的性能,但也有一些后果。请注意,您实际上可以使用 options compress
在数据集上有效地获取可变长度字符串,但在数据步骤中数据集是未压缩的。
在 SAS 中,分配 "A"
的长度为 10 的字符串实际上将具有值 "A "
。 A、加上9spaces。不是空字符,实际 space 个字符。这通常无关紧要,因为 SAS 以多种方式编写以忽略那些尾随的 space(因此 "A" = "A " = "A "
),但在这种特殊情况下它确实很重要(因为你正在转换 space字符).
您可以使用 trim
函数在 执行期间删除 spaces ,尽管它仍将与 space 一起存储当然是之后了。
new_name = prxchange("s/[^a-zA-Z0-9]/_/", -1, trim(name));
请注意 trim
不能 return 空值,它将 总是 return 单个 space,所以如果这是有可能的,您应该将其包装在 missing
的检查中(一个只有 spaces = 缺失的字符串变量)。
if not missing(name) then do;
new_name = prxchange("s/[^a-zA-Z0-9]/_/", -1, trim(name));
end;
else new_name = ' ';
有一个 trimn
函数可以 return 长度为 0 的字符串,但如果缺少它,则没有理由执行 prxchange - 这将节省时间。
您担心变量名称的尾随空格无效。变量名的尾随空格并不重要。此数据步骤仅创建一个变量。
376 options validvarname=any;
377 data test;
378 'xxx'n = 1;
379 'xxx 'n= 2;
380 run;
NOTE: The data set WORK.TEST has 1 observations and 1 variables.
NOTE: DATA statement used (Total process time):
real time 0.07 seconds
cpu time 0.03 seconds