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

UTF-8编码SAS会话导入ISO-8859-1文本文件遇字符与列偏移问题

解决SAS导入ISO-8859-1编码固定列文件的乱码与列偏移问题

问题本质:原文件是ISO-8859-1单字节编码,SAS会话为UTF-8多字节编码。使用encoding="wlatin1"可以解决乱码,但原@n定位是按字符数计算,而原文件列是按字节数划分,部分字符转UTF-8后占2字节,导致字段偏移。

解决方案:按字节位置截取字段

改用substrb函数(按字节处理)提取字段,既保证编码转换正确,又匹配原文件的固定列位置。修改后的SAS代码如下:

libname pathdata "/my/dir/dataset";

filename inp "/my/dir/file/prova.txt";
    
data pathdata.prova;
    infile inp encoding="wlatin1" lrecl=270 MISSOVER PAD firstObs=1;
    /* 定义临时变量存储整行,长度匹配文件lrecl */
    length line $270;
    /* 读取整行内容 */
    input line $char270.;
    
    /* 按原文件字节位置截取各字段 */
    colore = substrb(line, 1, 49);
    orig = substrb(line, 50, 200);
    app = substrb(line, 250, 10);
    data_v = substrb(line, 260, 10);
    
    /* 设置变量属性 */
    attrib colore length=$49 format=$char49. informat=$char49. ;
    attrib orig length=$200 format=$char200. informat=$char200. ;
    attrib app length=$10 format=$char10. informat=$char10. ;
    attrib data_v length=$10 format=$char10. informat=$char10.;
    
    /* 删除临时变量 */
    drop line;
run;

关键说明:

  • substrb:按字节数截取字符串,完全对应原文件的固定列字节位置,不受UTF-8多字节字符影响。
  • encoding="wlatin1":确保ISO-8859-1编码的字符正确转换为UTF-8存储,解决乱码问题。
  • 移除DSD参数:文件为固定列格式,DSD参数会干扰固定列读取逻辑。

内容的提问来源于stack exchange,提问作者CarLaTeX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:22:12