我正在使用基本的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;