2017-07-19 6 views
0

Ich manipuliere einige String-Variablen und bestimmte Zellen geben unerwartete Werte mit Teilstring- und Längenfunktionen zurück. Diese Zellen enthalten zeichenformatierte Daten, da ich aufgrund der Art der Excel-Datei, aus der sie stammen, einige Änderungen vornehmen muss, bevor ich sie in SAS-Daten umwandeln kann. Hier ein Beispiel:SAS 9.4 Zeichenfunktionen - Warum kann eine Zelle unerwartete Ergebnisse liefern?

HABEN:
Obs _orig
1 4/3
2 12/16
3 1/13
4 6/2
5 3/10
6 5/4
7 10/14

soll:
Obs _orig _length _sub_1_2
1 4/3 3 4/
2 12/16 5 12
3 1/13 4 1/
4 6/2 3 6/
5 3/10 4 3/
6 5/4 3 5/
7 10/14 5 10

ich diesen Code verwende:

data want; 
set have; 
_strip=strip(_orig); 
_sub_1_2=substr(_strip,1,2); 
_length=length(_strip); 
run; 

Dies ist, was ich bekomme. Die Diskrepanzen sind fett gedruckt.
Obs _orig _length _sub_1_2
1 4/3 5
2 12/16 5 12
3 1/13 4 1/
4 6/2 3 6/
5 3/10 4 3/
6 5/4 5
7 10/14 5 10

beide sind Fälle, in denen SAS berechnet Länge = 5, wenn Länge sollte = 3. In beiden Fällen ist der Wert für die Teilzeichen abgeleitete Variable ist blank insgesamt. Die Ergebnisse sind die gleichen, wenn ich compress(), trim() oder trimn() in meinem Code anstelle von strip() verwende. Danke für jede Hilfe, die Sie zur Verfügung stellen können

Antwort

0

Klingt wie vielleicht nicht druckbare Zeichen in Ihren Daten. Wenn Sie PUT _orig $hex.; zum Log sehen, was sehen Sie? Sollte sein: 342F332020

152 data want; 
153 length orig $5; 
154 orig='4/3'; 
155 len=length(orig); 
156 put orig= len=; 
157 put orig hex.; 
158 run; 

orig=4/3 len=3 
342F332020 

Um nicht-druckbare Zeichen loszuwerden, könnten Sie versuchen:

_strip=compress(orig,,'kw'); 
+0

Perfekt! Das nicht druckbare Zeichen war ein Zeilenumbruch in der Zelle, der vom Besitzer/Benutzer hinzugefügt wurde. Um die von Ihnen zur Verfügung gestellte Komprimierungsfunktion auszuführen, habe ich ein zusätzliches Komma hinzugefügt: _strip = compress (orig ,, 'kw'); Danke nochmal. – LRS

+0

Froh, es hat funktioniert. Guter Haken an den zwei Kommas. Die Antwort wurde aktualisiert. – Quentin

0

Scheint mir ziemlich klar, dass Ihre Variablen führende Leerzeichen oder andere Hauptfiguren, die wie Räume aussehen auf dem Bildschirm. Also für OBS = 6 ist der Wert der Zeichenfolge mehr wie " 5/4", die eine Länge von 5 hat und die ersten beiden Zeichen wie Leerzeichen aussehen. Wenn LENGTHN() Ihrer neuen Variable nicht 0 ist, dann hat es dort einige nicht druckbare Zeichen. Vielleicht etwas wie "A0'X", das manche Webseiten als nicht-brechendes Leerzeichen oder Tab-Zeichen verwenden ('09'x).

Ich vermute, dass Sie nicht die ersten zwei Zeichen wollen, sondern stattdessen das erste Wort, wenn Sie / als Trennzeichen verwenden. Sie können die LEFT() - oder STRIP() -Funktion verwenden, um die führenden Leerzeichen zu entfernen.Oder COMPRESS(), um anderen Müll zu entfernen. Sie könnten also COMPRESS() mit den Modifikatoren k und d verwenden, um nur die Ziffern und Schrägstriche zu behalten.

data want; 
    set have; 
    length first $5 ; 
    first = scan(compress(_orig,'/','kd'),1,'/'); 
run; 
Verwandte Themen