parsing - 使用 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;
结果:
我究竟做错了什么 ???
解决方案
为了更详细地了解汤姆的(正确)答案,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 数据的编码不完全相同,您仍然可能会遇到问题。考虑UNICODE
orUNICODEC
函数或KCVT
函数,以修改其中一个或另一个的字符集以匹配。
推荐阅读
- docker - 将使用 Docker 容器运行的网站从 HTTP 转换为 HTTPS
- android - Android:Okhttp3:SocketTimeoutException:无法连接到 dns/xx.xx.xx.xx(端口 443)
- php - 由于错误“cURL 错误 60:SSL 证书问题:无法获取本地颁发者证书”而无法获取文件
- angular - 为什么 Angular 在其源代码中使用静态类而不是导出函数?
- c++ - 如何静态制作 CMake 或 OpenCV 链接 [交叉编译 Linux -> Windows]
- plot - 重读命令使 gnuplot 中的动画失真
- php - PHP变量不显示在回声中
- php - foreach 循环中的文件仅包含一次
- vcloud-director-rest-api - vCloudDirector API 无法更改 vApp 的实例化参数
- typescript - 有什么办法可以避免在其他模块中声明的注入令牌的预先声明?