varchar类型的SQL列创建�符号读取到SAS中



我正在使用基本的libname和数据步骤从SQL表中将数据读取到SAS中。然而,某些"特殊字符"(在本例中为破折号(被读取为带有问号的黑色菱形:

我知道这是由编码问题引起的——SQL列的数据类型为varchar,SAS无法正确读取此数据类型(请详细说明发生这种情况的原因(。我知道的一个解决方案是将列更改为类型nvarchar;但是,我不拥有数据库,因此无法更改此项。

我尝试了各种与编码、inencoding和outencoding相关的选项(在libname和data步骤中(,但无法获得正确的组合(如果有的话(。

我目前的解决方法是创建一个使用CAST转换数据类型的视图,并将该视图读取到SAS中。然而,我确信一定有一个编码解决方案——有人知道吗?

在ASCII中,"U+FFFD�REPLACEMENT CHARACTER"用于替换未知、无法识别或无法表示的字符。如果这是唯一导致问题的字符,您可以简单地将其转换为短划线。

例如,让我们替换�带破折号的值:

data have;
length character $20.;
infile datalines dlm=',';
input character$;
datalines;
Sugar�free
Camera�ready
Custom�built
;
run;
data want;
set have;
character = tranwrd(character, '�', '-');
run;

如果这不起作用,这里有一个替代方案。

步骤1:查找字符的单个示例并获取其ASCII十六进制代码

data hex_code;
set have(obs=1);
ascii_hex = put(substr(character, 6, 1), $hex.);
run;

在这种情况下,十六进制代码为1A。我们可以将其用作十六进制文字来替换有问题的字符。

步骤2:将tranwrd与您找到的十六进制文字一起使用

SAS将自动将'1A'x理解为十六进制值,并在字符串中搜索它。如果找到,tranwrd将用破折号替换所有实例。

data want;
set have;
character = tranwrd(character, '1A'x, '-');
run;

最新更新