首页 > 解决方案 > 使用 m 修饰符的扫描功能未按预期工作

问题描述

扫描功能似乎没有按我的意愿工作。

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

结果:

在此处输入图像描述

它适用于 i=2 但我不明白为什么 i=3 和 i=4 为空白...我想要的是仅 i=2 存在连续分隔符的 scan=blank 。

但是,如果我的分隔符是逗号,它可以工作......

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

结果:

在此处输入图像描述

我究竟做错了什么 ???

标签: parsingsasscanning

解决方案


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

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

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

在大多数情况下,使用 UTF-8 设计的函数以“k”开头,其他方面类似于基本的 SAS 函数。然而,在少数情况下,他们不得不做出变体。

供您使用,kscanx是您想要的功能。这允许使用m修饰符。

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


推荐阅读