带有 m 修饰符的扫描功能未按预期工作

Scan function with m modifier not working as intended

扫描功能好像没有我想要的效果

data test;
do i=1 to 5;
text="ABC¤¤ABC¤ABC¤ABC";
scan = scan(text,i,"¤","m");
output;
end;
run;

结果:

enter image description here

它适用于 i=2 但我不明白为什么 i=3 和 i=4 是空白... 我想要的是 scan=blank for only i=2 where there is a continuous delimiter.

但是,如果我的分隔符是逗号,它会起作用...

data test;
do i=1 to 5;
text="ABC,,ABC,ABC,ABC";
scan = scan(text,i,",","m");
output;
end;
run;

结果:

enter image description here

我做错了什么???

我运行程序

data test;
do i=1 to 5;
text="ABC¤¤ABC¤ABC¤ABC";
scan = scan(text,i,"¤","m");
output;
end;
run;

得到这个

您的 SAS 会话正在使用 unicode。因此您尝试使用的符号需要一个以上的字节。 SCAN() 函数会将其视为两个单独的定界符。因此 M 修饰符将看到两个相邻的不同字节表示缺失值。

改用 KSCAN() 函数。

要使用 M 修饰符,您需要使用 KSCANX() 函数。 (我已要求 SAS 更新这三个函数的文档,以便它们相互引用。)

您可以尝试用一些单字节字符替换双字节字符,以便您可以使用 SCAN() 函数,但是您也可能会遇到分隔符被视为其他多字节中的字节之一的问题-字节字符串中的字符。

要详细了解 Tom 的(正确)答案,SAS 是一种早在 Unicode 之前就存在的语言。它在很大程度上保持向后兼容性,这意味着许多 SAS 函数与 Unicode 不兼容。

SAS 有一个页面 Internationalization Compatibility with SAS String functions,其中详细介绍了哪些函数与非单字节字符集(例如,UTF-8,一种多字节字符集)兼容。

列为“I18N 0 级”(I18N 是国际化的缩写 - I 和最后一个 n 之间的 18 个字符)的函数与非单字节字符集不兼容。 SCAN 是这些功能之一。 “I18N Level 1”可能有效也可能无效,而“I18N Level 2”旨在与 MBCS(例如 UTF-8)一起使用。

在大多数情况下,以 UTF-8 设计的函数以 'k' 开头,其他方面与基本 SAS 函数相似。但是,在某些情况下,他们不得不做出变体。

为了您的使用,kscanx 是您需要的功能。这允许使用 m 修饰符。

如果您的 SAS 会话和 SAS 数据的编码不完全相同,您仍有可能遇到问题。考虑 UNICODEUNICODEC 函数,或 KCVT 函数,修改一个或另一个的字符集以匹配。