SAS 编码乱码解决
一、乱码产生的原因
SAS 字符集及语言版本控制是通过 SASHome 文件夹内部的 sasv9.cfg 配置文件控制的,该文件控制了 SAS 启动时每个会话的编码格式和地区信息,默认中文版安装的配置文件为(zh/sasv9.cfg),根据文件中 encoding 和locale 信息,定义当前会话的编码和地区信息
修改字符集编码配置文件(推荐 u8 编码)
在 Windows 操作环境下:到 sasv9.cfg 文件:C:\ProgramFiles\SASHome\SASFoundation\9.4 用记事本打开它。更改如下:原始: -config "C:\Program Files\SASHome\SASFoundation\9.4\nls\zh\sasv9.cfg"
改为: -config "C:\Program Files\SASHome\SASFoundation\9.4\nls\u8\sasv9.cfg"
在 UNIX 操作环境下定位到/SASHome/SASFoundation/9.4/!SASROOT 改变 SAS 可执行文件的链接:修改:sas -> bin/sas_en 修改为:sas -> bin/sas_u8
SAS 会话默认字符集编码
注:在不修改 sasv9.cfg 配置文件的情况下,SAS 生成的数据集默认为 SAS 会话字符集编码
1、导入数据乱码
字符集编码不统一
原因:SAS 会话默认字符集编码与导入数据字符集编码不统一
乱码文字生成
字符集编码截断
原因:SAS 导数向导中定义的字符变量长度不够,导致字符集编码截断
2、导出数据乱码
字符集编码不统一
原因:SAS 会话默认字符集编码会直接传递给导出文件,而 excel 及 csv 文件默认打开格式为 utf8
二、解决办法
第一步:查看当前会话编码
方式1:
proc options option=encoding;
方式2:
%put &sysencoding;
方式3:
data _null_;
val=getoption('encoding');
put val=;
run;
第二步:查看数据集的编码信息
方式1:
proc contents data=lbname.dataset;
方式2:
%let dsn=lb.dataset; *逻辑库.数据集;
%let dsid=%sysfunc(open(&dsn,i));
%let encoding=%sysfunc(attrc(&dsid,encoding)).;
%let rc=%sysfunc(close(&dsid));
%put &encoding.;
第三步编码转换
1、转换字符串
*NEW=KCVT(text, intype, outtype, <options,…> ) newvar=kcvt(oldvar, ‘ZEUC’, ’UTF8’);
%let newvar=%sysfunc(kcvt(%str(xxxx),"gb2312","utf-8"));
%put &newvar.;
2、转化单个数据集
方式一:
*转换某个数据集;
libname inlib cvp "C:\path1" cvpengine=v9 CVPMULTIPLIER=1.5 inencoding=gb2312;
libname outlib "C:\path2" outencoding=utf8;
*转换后的编码;
proc copy noclone  in=inlib out=outlib;
select datasetname;
方式二:
*使用宏;
%COPY_TO_NEW_ENCODING(from_dsname, to_dsname, new_encoding);
方式三:
/*读取指定编码的数据集*/
data aaa;
set lbname.datasetname(encoding='gb2312');
run;
data bbb(encoding='utf8');
set lbname.datasetname;
run;
3、转化整个逻辑库
*转换整个逻辑库;
libname inlib cvp "C:\path1" cvpengine=v9 CVPMULTIPLIER=1.5 inencoding=gb2312;
libname outlib "C:\path2" outencoding=utf8;
*转换后的编码;
proc copy noclone  in=inlib out=outlib;
run;