Eu tenho o arquivo prova.txt
:
01 ±00CC00 2023-07-21
50 MSTAT»BR_02»BR_07»BR_14 ±000066 2023-07-19
01 ±00CC00 2023-07-21
que tem esta codificação ( file -bi prova.txt
):
text/plain; charset=iso-8859-1
Estou tentando importá-lo no SAS com este programa:
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;
Se eu não usar, encoding="wlatin1"
recebi caracteres errados no conjunto de dados SAS:
Se eu usar, encoding="wlatin1"
obtive os caracteres corretos, mas as seguintes variáveis são alteradas:
A codificação da sessão é ENCODING=UTF-8
.
Leia-o com ENCODING=ANY e, em seguida, transcodifique as strings você mesmo.
Certifique-se de definir as variáveis por tempo suficiente para manter a versão UTF-8 do texto, portanto, mais do que o número de bytes lidos do arquivo.
Ou leia o arquivo usando a codificação WLATIN1, mas extraia as strings da variável _INFILE_ usando KSUBSTR() em vez da instrução INPUT.
O motivo pelo qual você está tendo problemas ao usar ENCODING="WLATIN1" ao ler o arquivo em uma sessão SAS que está usando a codificação UTF-8 é que as linhas são transcodificadas durante a leitura. Portanto, a localização na linha do campo APP e DATA_V se move quando os caracteres não ASCII são transcodificados de byte único para byte múltiplo.
Se você não quisesse ler por posição de coluna, mas tivesse um tipo delimitado, como um arquivo CSV, não teria problemas.