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
相关产品推荐
相关产品推荐

