You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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选项,需手动完成编码转换后以二进制形式写入文件:

步骤说明

  1. 手动转换编码:用KCVT函数将WLATIN2编码的XML_CONTENT转换为UTF-8编码的字节序列。
  2. 二进制写入:将转换后的UTF-8字节以无格式方式写入文件,避免SAS自动处理编码或添加换行符。
  3. 保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:17:33