2016-04-02 14 views
1

Eingang:vom Eingang mit Doppelschlepp Lesen @@

G0894 x 1 x 3 x 1 k 1 
C4458 x 1 k 5 
C9057 x 7 x 4 x 4 x 3 x 5 

gewünschte Ausgabe:

G0894 x 1 
G0894 x 3 
G0894 x 1 
G0894 k 1 
C4458 x 1 
C4458 k 5 
C9057 x 7 
C9057 x 4 
C9057 x 4 
C9057 x 3 
C9057 x 5 

Dies ist, was ich kam mit:

data want; 
    infile cards missover; 
    input id $ @; 
    do while (1); 
     input letter $ number @; 
     if letter EQ ' ' then leave; 
    output; 
end; 
cards; 
G0894 x 1 x 3 x 1 k 1 
C4458 x 1 k 5 
C9057 x 7 x 4 x 4 x 3 x 5 
; 
run; 

Und es tut funktionieren, aber da wir über Double Trailing @@ in der Klasse sprechen, denke ich, dass ich es verwenden soll. Das war mein anderer Ansatz:

data want; 
    infile cards missover; 
    input id $ @; 
    input letter $ number @@; 
cards; 
G0894 x 1 x 3 x 1 k 1 
C4458 x 1 k 5 
C9057 x 7 x 4 x 4 x 3 x 5 
; 
run; 

Und es erzeugt einen Fehler, der etwas über die Verwendung von missover und @@ in kohärenter Weise sagt. Was mache ich falsch?

Antwort

2

In Ihrem Programm gibt es keine Möglichkeit, dass der Datenschritt jemals in die zweite Zeile der Eingabedaten übergeht. Das sagt Ihnen die Fehlermeldung.

Das @@ teilt SAS mit, dass Zeilen- und Spaltenzeiger beim Starten der nächsten Datenschritt-Iteration beibehalten werden sollen. Die Option MISSOVER weist SAS an, nicht zu einer neuen Zeile zu wechseln, wenn keine Daten gefunden werden, die die aktuelle Eingabeanforderung erfüllen. Daher gibt es keine Möglichkeit, dass der Linienzeiger jemals in die zweite Zeile vorrückt.

+0

Sie könnten nur ein bisschen mehr erklären wollen - es könnte nicht ohne weiteres ersichtlich sein, warum das der Fall ist. – Joe

0

Das doppelte abschließende Zeichen (@@) enthält einen Datensatz über mehrere Iterationen des DATA-Schritts, bis das Ende des Datensatzes erreicht ist. Das einzelne abschließende Zeichen (@) gibt jedoch einen Datensatz frei, wenn die Steuerung an den Anfang des DATA-Schritts zurückkehrt.

Try this:

data want; 
    infile cards missover; 
    input id $ letter $ number @; 
    do while (letter ne '' or number ne .); 
     output; 
     input letter $ number @; 
    end; 
cards; 
G0894 x 1 x 3 x 1 k 1 
C4458 x 1 k 5 
C9057 x 7 x 4 x 4 x 3 x 5 
; 
run; 
Verwandte Themen