我有文件prova.txt
:
01 ±00CC00 2023-07-21
50 MSTAT»BR_02»BR_07»BR_14 ±000066 2023-07-19
01 ±00CC00 2023-07-21
其编码为 ( file -bi prova.txt
):
text/plain; charset=iso-8859-1
我正在尝试使用此程序将其导入 SAS 中:
libname pathdata "/my/dir/dataset";
filename inp "/my/dir/file/prova.txt";
data pathdata.prova;
Infile inp /*encoding="wlatin1"*/ lrecl=270 DSD MISSOVER PAD firstObs=1;
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.;
Input
@1 colore $char49.
@50 orig $char200.
@250 app $char10.
@260 data_v $char10.
;
run;
如果我不使用,encoding="wlatin1"
我会在 SAS 数据集中得到错误的字符:
如果我使用,encoding="wlatin1"
我会得到正确的字符,但以下变量会发生变化:
会话编码是ENCODING=UTF-8
.
使用 ENCODING=ANY 读取它,然后自己对字符串进行转码。
确保定义的变量足够长以容纳文本的 UTF-8 版本,因此比从文件读取的字节数长。
或者使用 WLATIN1 编码读取文件,但使用 KSUBSTR() 而不是 INPUT 语句从 _INFILE_ 变量中提取字符串。
在使用 UTF-8 编码的 SAS 会话中读取文件时,使用 ENCODING="WLATIN1" 时遇到问题的原因是读取时行被转码。因此,当非 ASCII 字符从单字节转码为多字节时,APP 和 DATA_V 字段所在行的位置会发生移动。
如果您不想按列位置读取,而是使用分隔符(如 CSV 文件),则不会遇到麻烦。