【问题标题】:Scan function with m modifier not working as intended使用 m 修饰符的扫描功能未按预期工作
【发布时间】:2021-03-05 15:59:29
【问题描述】:

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

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

我做错了什么???

【问题讨论】:

  • 那个字符的十六进制代码是什么?
  • 不知道。 Unicode 是 U+00A4。在此处查看更多信息compart.com/fr/unicode/U+00A4
  • SCAN() 不理解多字节字符。

标签: parsing sas scanning


【解决方案1】:

为了更详细地了解 Tom 的(正确)答案,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 数据的编码不完全相同,您仍然可能会遇到问题。考虑使用UNICODEUNICODEC 函数或KCVT 函数来修改其中一个或另一个的字符集以匹配。

【讨论】:

  • 感谢您的详细解答!
【解决方案2】:

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

请改用 KSCAN() 函数。

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

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

【讨论】:

  • 感谢您的回答。我用“|”替换了它以避免此错误。是否有一个自定义分隔符,只有 SAS 才能确保人们不会遇到任何错误?
【解决方案3】:

我运行了程序

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

得到了这个

【讨论】:

  • 您的 SAS 版本是多少?我的是 SYSVLONG4=9.04.01M6P11072018。
  • 9.04.01M3P062414
猜你喜欢
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2014-08-13
  • 2013-08-29
  • 2020-04-28
  • 2021-08-27
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多