سؤال

لدي متغير سلسلة. أحتاج إلى تحويل جميع الأحرف غير الرقمية إلى المساحات (""). لدي مشكلة مع أحرف Unicode. يتم تحويل أحرف Unicode (الأحرف خارج Charset الأساسية) إلى بعض الأحرف غير صالحة. انظر الرمز على سبيل المثال.

هل هناك أي طريقة أخرى لتحقيق نفس النتيجة مع الإجراء الذي لا يختنق على شخصيات Unicode الخاصة؟

new file.

set unicode = yes.
show unicode.

data list free
 /T (a10).
begin data
1234
5678
absd
12as
12(a
12(vi
12(vī
12āčž
end data.

string Z (a10).
comp Z = T.

loop #k = 1 to char.len(Z).
if ~range(char.sub(Z, #k, 1), "0", "9") sub(Z, #k, 1) = " ".
end loop.

comp Z = normalize(Z).

comp len = char.len(Z).

list var = all.

exe.

النتائج:

T          Z               len

1234       1234              4
5678       5678              4
absd                         0
12as       12                2
12(a       12                2
12(vi      12                2
12(vī     12   �          6

>Warning # 649
>The first argument to the CHAR.SUBSTR function contains invalid characters.
>Command line: 1939  Current case: 8  Current splitfile group: 1

12āčž   12   �ž        7


Number of cases read:  8    Number of cases listed:  8
هل كانت مفيدة؟

المحلول 2

ماذا عن بدلًا من استبدال الأحرف غير الرقمية ، يمكنك الدوران على رغم ذلك وسحب الشخصيات الرقمية وإعادة البناء Z؟ (لاحظ أن روايتي هنا قبل CHAR. وظائف السلسلة.)

data list free
 /T (a10).
begin data
1234
5678
absd
12as
12(a
12(vi
12(vī
12āčž
12as23
end data.

STRING Z (a10).
STRING #temp (A1).
COMPUTE #len = LENGTH(RTRIM(T)).
LOOP #i = 1 to #len.
  COMPUTE #temp = SUBSTR(T,#i,1).
  DO IF INDEX('0123456789',#temp) > 0.
    COMPUTE Z = CONCAT(SUBSTR(Z,1,#i-1),#temp).
  ELSE.
    COMPUTE Z = CONCAT(SUBSTR(Z,1,#i-1)," ").
  END IF. 
END LOOP.
EXECUTE.

نصائح أخرى

لا ينبغي استخدام وظيفة Sentrst على الجانب الأيسر من التعبير في وضع Unicode ، لأن حرف الاستبدال قد لا يكون نفس عدد بايت مثل الأحرف (الأحرف) التي يتم استبدالها. بدلاً من ذلك ، استخدم وظيفة استبدال على الجانب الأيمن.

الشخصيات الفاسدة التي تراها بسبب عدم تطابق الحجم هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top