2012-04-13 5 views
0

Ich arbeite mit einigen Rohdaten, die feste Spaltenbreiten hat, aber hat alle seine Datensätze in einer einzigen Zeile geschrieben (Schuld dem Datenanbieter, nicht ich :-)). Ich weiß, wie feste Spaltenbreiten in der INPUT Anweisung zu verwenden, und wie @@ verwenden, mehr als eine Beobachtung pro Zeile zu lesen, aber ich habe Probleme, wenn ich versuche, beides zu tun.SAS DATA step/INPUT-Anweisung: Spaltenbasierte Rohdaten UND mehrere Beobachtungen aus einer Zeile lesen?

Als Beispiel, hier ist ein Code, wo die Daten feste Spaltenbreiten hat, aber es gibt eine Zeile pro Datensatz. Dieser Code funktioniert:

DATA test_1; 
    INPUT alpha $ 1-5 beta $ 6-10 gamma 11-15 ; 

    DATALINES; 
a f 1 
ab fg 12 
abc fgh 123 
abcd fghi 1234 
abcdefghij12345 
    ; 
RUN; 

Jetzt ist hier der Code für das, was ich wirklich zu tun versuchen - alle Daten in einer Zeile ist, und ich versuche, die @@ Notation zu verwenden:

DATA test_2; 
    INPUT alpha $ 1-5 beta $ 6-10 gamma 11-15 @@; 

    DATALINES; 
a f 1 ab fg 12 abc fgh 123 abcd fghi 1234 abcdefghij12345 
    ; 
RUN; 

Das scheitert, weil es nur die ersten 15 Zeichen liest, diesen Datensatz hält und von Anfang an neu liest. Basierend auf meinem Verständnis der Semantik der Notation @@ kann ich definitiv verstehen, warum dies passieren würde.

Gibt es eine Möglichkeit, wie ich fixe Spaltendaten aus einer einzigen Zeile lesen kann; das heißt, make test_2 haben den gleichen Inhalt wie test_1? Vielleicht durch eine Kombination von Symbolen in der INPUT-Anweisung oder vielleicht durch eine andere Methode (mit Datei-E/A-Funktionen, PROC IMPORT usw.)?

Antwort

2

Haben Sie versucht, variable Längen mit Hilfe von Informationen anzugeben?

Zum Beispiel:

DATA test_2; 
    INPUT alpha $5. beta $5. gamma 5.0 @@; 

    DATALINES; 
a f 1 ab fg 12 abc fgh 123 abcd fghi 1234 abcdefghij12345 
; 
RUN; 

Von der SAS-Dokumentation:

Formatierte Eingabe bewirkt, dass der Zeiger wie die Säuleneingabe zu bewegen einen variablen Wert zu lesen. Der Zeiger bewegt sich um die im Informationsfeld angegebene Länge und bleibt in der nächsten Spalte stehen.

+1

Nizza ... nicht sicher, was ich anders tat, aber es getestet und es funktioniert auf den Beispieldaten –

+0

Wow, ich bin so verwendet, mit Spalten unterschiedlicher Breite zu arbeiten und mit Hilfe der ':' Notation Ich habe vergessen, absolute Breiten anzugeben, indem ich einfach das ':' weglege und die Breite festlege. Ich akzeptiere diese Antwort jetzt, aber ich hatte gehofft, dass du mir auch sagen könntest: Warum sagen die Leute "Alpha 1-5", wenn sie einfach "Alpha $ 5" sagen könnten? Ist die frühere Notation eine Art von Legacy-Unterstützung? Wie auch immer, danke für die tolle Antwort. –

+1

Alpha $ 1-5 und Alpha $ 5 machen verschiedene Dinge. Der erste liest aus den Spalten 1-5 in der aktuellen Eingabezeile (und das ist die Ursache des ursprünglichen Problems). Die zweite liest die NEXT 5 Zeichen von der aktuellen Position. So ersetzt man nicht einen anderen, sie ergänzen sich. –

Verwandte Themen