Question

J'ai une variable de chaîne. J'ai besoin de convertir tous les caractères non chiffres en espaces (""). J'ai un problème avec les caractères Unicode. Les caractères Unicode (les caractères en dehors du charset de base) sont convertis en caractères invalides. Voir le code par exemple.

Existe-t-il un autre moyen d'atteindre le même résultat avec la procédure qui ne s'étoufferait pas sur les caractères Unicode spéciaux?

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.

Le résultat:

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
Était-ce utile?

La solution 2

Que diriez-vous au lieu de remplacer les caractères non numériques, vous faites du vélo et retirez les caractères numériques et reconstruisez Z? (Remarque ma version ici est pré CHAR. fonctions de chaîne.)

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.

Autres conseils

La fonction substr ne doit pas être utilisée sur le côté gauche d'une expression en mode Unicode, car le caractère de remplacement peut ne pas être le même nombre d'octets que le ou les caractères remplacés. Au lieu de cela, utilisez la fonction de remplacement sur le côté droit.

Les personnages corrompus que vous voyez sont dus à ce décalage de taille.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top