Как работать с файлами в кодировке UTF-8 в сеансе SAS в кодировке WLATIN1? - PullRequest
2 голосов
/ 14 марта 2019

В настоящее время мы используем WLATIN1 (Windows 1252) encoding на нашем сервере сеансов SAS (и, похоже, нет предстоящего перехода на UTF-8).

У меня есть файл EXCEL (который является экспортом из базы данных Интернета), который закодирован в UTF-8 и содержит один специальный символ , который не поддерживается Ссылка на вики ) вWLATIN1 encoding.Я знаю, что могу читать в EXCEL-данных, используя другую кодировку, например UTF-8, но все же ODS будет печатать = вместо .

Я хотел бы сопоставить некоторые строки, содержащие эту специальнуюперсонаж, но SAS, конечно, не позволяет мне использовать этот персонаж по-своему.Есть ли способ обойти это?

MWE: Предположим, что файл EXCEL содержит одну переменную a и одно наблюдение a = 'this is a test ≥':

data encoding;
set excel;

if a ='this is a test ≥' then
put 'it works';
else 
put 'it does not work';

run;

Можно ли это исправить любым способом??Я попробовал '(*ESC*){unicode "2265"x}' вместо , но не смог заставить его работать.Как всегда, любая помощь / идея очень ценится!

РЕДАКТИРОВАТЬ: Мы работаем SAS Release 9.4 TS1M5.В настоящее время считывание EXCEL-файла выполняется с помощью PROC IMPORT:

filename temp "*.xlsx" encoding="utf-8";

proc import datafile=temp out=quality dbms=excel replace;
run;

1 Ответ

2 голосов
/ 15 марта 2019

Если вы находитесь в среде SAS Server, вам необходимо настроить сервер с параметрами запуска поддержки Unicode.

В среде рабочего стола сеанс можно запустить с поддержкой Unicode из Icon в глубине меню запуска SAS.Командная строка:

"C:\Program Files\SASHome\SASFoundation\9.4\sas.exe" 
           -CONFIG "C:\Program Files\SASHome\SASFoundation\9.4\nls\u8\sasv9.cfg"

Файл конфигурации nls\u8\ будет содержать несколько строк с настройками кодирования, которые могут быть применены только при запуске сеанса, а также путь к библиотекам SAS, поддерживающим utf8session.

…
-SET SASCFG "C:\Program Files\SASHome\SASFoundation\9.4\nls\u8"
-DBCS 
-LOCALE en_US
-ENCODING UTF-8
…

В сеансе Unicode в журнале примера кода ниже будет показано различие между ≥ и =, а ODS выведет ≥.Тот же код в сеансе SBCS по умолчанию, на который отображается ≥ =, даже когда редактор кода показывает ≥.

Шрифт окна LOG должен быть установлен на Consolas или другой шрифт с поддержкой UTF-8.

data have;
input; a = _infile_; datalines;
this is a test ≥
run;

data want;
  set have;

  c1 = '≥';
  c2 = '=';
  put "NOTE: " (c:) (=);

  r1 = rank(c1);
  r2 = rank(c2);

  put "NOTE: " (r:) (=);

  if a = 'this is a test ≥' 
    then put "NOTE: " a 'it works';
    else put "NOTE: " a 'it does not work';
run;
proc print data=want;
run;
--------------------
NOTE: c1== c2==
NOTE: r1=226 r2=61
NOTE: this is a test = it works

Тот же код в сеансе по умолчанию (SBCS) показывает, что ≥ будет транскодирован в =

NOTE: c1== c2==
NOTE: r1=61 r2=61
NOTE: this is a test = it works

Улучшенный редактор может поддерживать UTF-8 во всех случаях, но (Я размышляю), когда запускается представление, транскодируется в кодировку сеанса.

...