Мэйнфрейм SAS заменит 20..99 на 200099

#sas

#sas

Вопрос:

В моем коде мэйнфрейма sas как заменить. с 0?

 data newlic;
INPUT @1 LICNO $10.;       
DATALINES;                 
203....412                 
...3300421                 
9955..032.                 
;                          
RUN;                       
PROC PRINT DATA = NEWLIC;  
RUN;                       
DATA MYDATA;               
SET NEWLIC;                
  ARRAY A(*) _NUMERIC_;      
  DO I=1 TO DIM(A);          
  IF A(I) = . THEN A(I) = 0; 
 END;                       
DROP I;                    
 RUN;                       
PROC PRINT DATA = MYDATA;  
RUN;                       
  

мой требуемый результат

 2030000412                 
0003300421                 
9955000320
  

требуется заменить ‘.’ на 0

Ответ №1:

Используйте регулярное выражение для замены всех не алфавитно-цифровых символов на 0:

s/[^0-9a-zA-Z]/0/

Вы можете реализовать замены регулярных выражений в SAS с prxchange() помощью .

 data mydata;
    set newlic;

    licno = prxchange('s/[^0-9a-zA-Z]/0/', -1, licno);
run;
  

Комментарии:

1. Hi Stu Sztukowski,

2. Спасибо за быстрый ответ, который вы дали, код работает нормально, но мое основное требование — к любому нечисловому, например, пробелу / мусору / фрахтователю, которые хотят заменить на 0

3. Теперь требуется, чтобы, если лицензия не числовая, не удалялась, вместо этого замените значение на 0.

Ответ №2:

Вы можете использовать функцию TRANSLATE () для замены ненужных символов на ‘0’. Вы можете использовать функцию COMPRESS() с d модификатором, чтобы найти любые нецифровые символы, которые существуют в значении.

 fixed=translate(licno,repeat('0',255),compress(licno,,'d'));
  

Результаты:

 Obs    LICNO           fixed

 1     1234567890    1234567890
 2     ABC      9    0000000009
 3     203....412    2030000412
 4     ...3300421    0003300421
 5     9955..032.    9955000320
 6     123           1230000000
  

Комментарии:

1. Привет, Том, спасибо за быстрый ответ, ваш код отличный, но я получаю одну исправленную ошибку 15= TRANSLATE(LICNO,REPEAT(‘0′,255),COMPRESS(LICNO,,’D’)); ОШИБКА: нулевые параметры для СЖАТИЯ недопустимы.

2. пожалуйста, поделитесь каким-нибудь решением вышеуказанной проблемы

3. пожалуйста, дайте какое-нибудь решение вышеуказанной проблемы, спасибо и с уважением, Кришна

4. Вы пытаетесь использовать это в коде SQL? Вы можете просто ввести цифры. COMPRESS(LICNO,'0123456789')

5. Спасибо и с уважением, Кришна

Ответ №3:

Вы можете использовать метасимвол шаблона регулярных выражений D для поиска нецифровых символов и замены их 0 при использовании PRXCHANGE() .

Из полного списка в документации

d соответствует символу цифры, эквивалентному [0−9] .
D соответствует любому символу, который не является цифрой.

Пример:

 data have; input
licno $char10.; datalines;
1234567890
ABC      9
203....412
...3300421
9955..032.
123       
;

data want;
  set have;
  fixed = prxchange('s/D/0/', -1, licno);
run;