2016-03-24 1 views
0

Je suis à la recherche d'un moyen de diviser une très longue chaîne en utilisant ce delimiter: '| 'diviser une chaîne en utilisant un séparateur de mot sas

La fonction de balayage ne semble pas accepter delimiter mot si je fais

scan(string,3,'| ') 

il se divisera à chaque | et de l'espace
au lieu de tous les '| ' comme je l'ai besoin.

Dans la documentation, je ne vois aucun modificateur permettant cela. http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000214639.htm

+0

Je viens de recevoir une idée: utiliser transwrd pour remplacer '| 'par' _', puis utilisez l'analyse –

+0

Supprimez l'espace de votre délimiteur dans la fonction de numérisation, et cela devrait fonctionner correctement. Si vous disposez d'un espace supplémentaire, utilisez une bande ou une moulure pour retirer les espaces de tête. – Reeza

Répondre

0

je l'ai trouvé par moi-même

utilisation tranwrd pour remplacer '| ' par '_'

newstring=tranwrd(string,'| ','_'); 

et je peux utiliser la fonction de balayage normalement

xxx=scan(newstringstring,3,'_'); 
+1

Vous pourriez envisager une chaîne de remplacement un peu plus obscure. 'FF'X –

+0

bonne idée, j'ai découvert _ était déjà dans la chaîne et je suis passé à%, mais je vais essayer votre idée –

1

INFILE a DLMSTR lorsqu'il est combiné avec la magie infile peut faire exactement ce dont vous avez besoin. Votre idée de transwrd devrait bien fonctionner.

enter image description here

data test; 
    input string $50.; 
    cards4; 
This|is | pipe space| delmimited 
This| is| too I believe 
;;;; 
    run; 
data test2; 
    infile cards missover dlmstr='| '; 
    if _n_ eq 1 then input @; 
    array w[5] $64; 
    do while(not eof); 
     set test end=eof; 
     _infile_ = string; 
     input @1 w[*] @; 
     output; 
     end; 
    stop; 
    cards; 
Necessary evil 
    run;