使用RECFM=N时如何在SAS中导出UTF-8编码的XML?
问题
从数据库表读取XML片段拼接生成完整XML文件,使用SAS的FILE命令并添加RECFM=N参数避免文件末尾出现CRLF字符。当前SAS编码为WLATIN2,但生成的XML需要UTF-8编码。设置RECFM=N时,SAS提示「ENCODING option ignored for files opened with RECFM=N」;若不指定UTF-8编码,XML文件会包含无效字符。请问如何导出UTF-8编码的XML文件?
原SAS代码
proc sql noprint; select distinct PROCESS_ID into :g_processIDList separated by ' ' from out_lib.Dbn_xml_data; quit; %put &g_processIDList.; %macro DAR_XML_PROCESSING1; %if %length(&g_processIDList.) ne 0 %then %do; %do i=1 %to %sysfunc(countw(&g_processIDList., ' ')); %let l_processID=%scan(&g_processIDList.,&i,%str( )); %put processing: &l_processID.; data HELP; set out_lib.DBN_XML_DATA (where=(PROCESS_ID = "&l_processID.")); run; proc sort data=HELP out=HELP (keep=XML_CONTENT); by PART_ID; run; filename out "\\somePath\&l_processID..xml" RECFM=N encoding="utf-8"; data _null_; file OUT; set HELP; put XML_CONTENT; run; %end; %end; %else %do; %put [NOTE]: nothing to process!!; %end; %mend DAR_XML_PROCESSING1; %DAR_XML_PROCESSING1;
解决方案
使用RECFM=N时,SAS会忽略ENCODING选项,需手动完成编码转换后以二进制形式写入文件:
步骤说明
- 手动转换编码:用
KCVT函数将WLATIN2编码的XML_CONTENT转换为UTF-8编码的字节序列。 - 二进制写入:将转换后的UTF-8字节以无格式方式写入文件,避免SAS自动处理编码或添加换行符。
- 保留RECFM=N:确保文件以流式二进制格式打开,彻底避免末尾CRLF。
修改后的代码
proc sql noprint; select distinct PROCESS_ID into :g_processIDList separated by ' ' from out_lib.Dbn_xml_data; quit; %put &g_processIDList.; %macro DAR_XML_PROCESSING1; %if %length(&g_processIDList.) ne 0 %then %do; %do i=1 %to %sysfunc(countw(&g_processIDList., ' ')); %let l_processID=%scan(&g_processIDList.,&i,%str( )); %put processing: &l_processID.; data HELP; set out_lib.DBN_XML_DATA (where=(PROCESS_ID = "&l_processID.")); /* 将WLATIN2编码内容转换为UTF-8字节 */ xml_utf8 = kcvt(xml_content, 'WLATIN2', 'UTF-8'); run; proc sort data=HELP out=HELP (keep=xml_utf8); by PART_ID; run; filename out "\\somePath\&l_processID..xml" RECFM=N; data _null_; file OUT; set HELP; /* 连续写入UTF-8字节,不添加换行符 */ put xml_utf8 $char. @; run; %end; %end; %else %do; %put [NOTE]: nothing to process!!; %end; %mend DAR_XML_PROCESSING1; %DAR_XML_PROCESSING1;
关键修改点
- 新增
xml_utf8 = kcvt(xml_content, 'WLATIN2', 'UTF-8');完成编码转换。 - FILENAME语句移除无效的ENCODING选项。
- PUT语句使用
$char.格式配合@符号,确保字节连续写入,无额外换行符。
内容的提问来源于stack exchange,提问作者Keliimek
相关产品推荐
相关产品推荐

