我还编写了一些函数来处理键盘布局错误。下面是代码:
/***************************************************************************/
/* FUNCTION count_rus_letters RETURNS NUMBER OF CYRILLIC LETTERS IN STRING */
/***************************************************************************/
proc fcmp outlib=sasuser.userfuncs.mystring;
FUNCTION count_rus_letters(string $);
length letter $2;
rus_count=0;
len=klength(string);
do i=1 to len;
letter=ksubstr(string,i,1);
if letter in ("Ð","а","Ð","б","Ð","в","Ð","г","Ð","д","Ð","е","Ð","Ñ","Ð","ж"
"Ð","з","Ð","и","Ð","й","Ð","к","Ð","л","Ð","м","Ð","н","Ð","о","Ð","п","Ð ","Ñ",
"С","Ñ","Т","Ñ","У","Ñ","Ф","Ñ","Ð¥","Ñ
","Ц","Ñ","Ч","Ñ","Ш","Ñ","Щ","Ñ","Ъ","Ñ"
"Ы","Ñ","Ь","Ñ","Ð","Ñ","Ю","Ñ","Я","Ñ")
then rus_count+1;
end;
return(rus_count);
endsub;
run;
/**************************************************************************/
/* FUNCTION count_eng_letters RETURNS NUMBER OF ENGLISH LETTERS IN STRING */
/**************************************************************************/
proc fcmp outlib=sasuser.userfuncs.mystring;
FUNCTION count_eng_letters(string $);
length letter $2;
eng_count=0;
len=klength(string);
do i=1 to len;
letter=ksubstr(string,i,1);
if rank('A') <= rank(letter) <=rank('z')
then eng_count+1;
end;
return(eng_count);
endsub;
run;
/**************************************************************************/
/* FUNCTION is_string_russian RETURNS 1 IF NUMBER OF RUSSIAN SYMBOLS IN */
/* STRING >= NUMBER OF ENGLISH SYMBOLS */
/**************************************************************************/
proc fcmp outlib=sasuser.userfuncs.mystring;
FUNCTION is_string_russian(string $);
length letter $2 result 8;
eng_count=0;
rus_count=0;
len=klength(string);
do i=1 to len;
letter=ksubstr(string,i,1);
if letter in ("Ð","а","Ð","б","Ð","в","Ð","г","Ð","д","Ð","е","Ð","Ñ","Ð","ж"
"Ð","з","Ð","и","Ð","й","Ð","к","Ð","л","Ð","м","Ð","н","Ð","о","Ð","п","Ð ","Ñ",
"С","Ñ","Т","Ñ","У","Ñ","Ф","Ñ","Ð¥","Ñ
","Ц","Ñ","Ч","Ñ","Ш","Ñ","Щ","Ñ","Ъ","Ñ"
"Ы","Ñ","Ь","Ñ","Ð","Ñ","Ю","Ñ","Я","Ñ")
then rus_count+1;
if rank('A') <= rank(letter) <=rank('z')
then eng_count+1;
end;
if rus_count>=eng_count
then result=1;
else result=0;
return(result);
endsub;
run;
/**************************************************************************/
/* FUNCTION fix_layout_misprints REPLACES MISPRINTED SYMBOLS BY ANALYSING */
/* LANGUAGE OF THE STRING (FOR ENGLISH STRING RUSSIAN SYMBOLS ARE */
/* REPLACED BY ENGLISH COPIES AND FOR RUSSIAN STRING SYMBOLS ARE */
/* REPLACED BY RUSSIAN COPIES) */
/**************************************************************************/
proc fcmp outlib=sasuser.userfuncs.mystring;
FUNCTION fix_layout_misprints(string $) $ 1000;
length letter $2 result $1000;
eng_count=0;
rus_count=0;
len=klength(string);
do i=1 to len;
letter=ksubstr(string,i,1);
if letter in ("Ð","а","Ð","б","Ð","в","Ð","г","Ð","д","Ð","е","Ð","Ñ","Ð","ж"
"Ð","з","Ð","и","Ð","й","Ð","к","Ð","л","Ð","м","Ð","н","Ð","о","Ð","п","Ð ","Ñ",
"С","Ñ","Т","Ñ","У","Ñ","Ф","Ñ","Ð¥","Ñ
","Ц","Ñ","Ч","Ñ","Ш","Ñ","Щ","Ñ","Ъ","Ñ"
"Ы","Ñ","Ь","Ñ","Ð","Ñ","Ю","Ñ","Я","Ñ")
then rus_count+1;
if rank('A') <= rank(letter) <=rank('z')
then eng_count+1;
end;
if rus_count>=eng_count
then result=ktranslate(string,"ÐаÐÐеÐкÐÐоРÑСÑТХÑ
","AaBEeKkMOoPpCcTXx");
else result=ktranslate(string,"AaBEeKkMOoPpCcTXx","ÐаÐÐеÐкÐÐоРÑСÑТХÑ
");
return(result);
endsub;
run;
/***********/
/* EXAMPLE */
/***********/
options cmplib=sasuser.userfuncs;
data _null_;
good_str="Ðванов";
err_str="Ðвaнов";
fixed_str=fix_layout_misprints(err_str);
put "Good string=" good_str;
put "Error string=" err_str;
put "Fixed string=" fixed_str;
rus_count_in_err=count_rus_letters(err_str);
put "Count or Cyrillic symbols in error string=" rus_count_in_err;
eng_count_in_err=count_eng_letters(err_str);
put "Count or English symbols in error string=" eng_count_in_err;
is_error_str_russian=is_string_russian(err_str);
put "Is error string language Russian=" is_error_str_russian;
if (good_str ne err_str)
then put "Before clearing - strings are not equal to each other";
if (good_str = fixed_str)
then put "After clearing - strings are equal to each other";
run;