2016-06-19 19 views
0

Ich möchte Zeilenwerte (Darlehen mit Kontonummer) aus einer SAS-Tabelle abrufen - Hier finden Sie ein Beispiel.SAS Abrufen von Werten aus Zeile

enter image description here

Eingang

Account Number Loans 
123    abc, def, ghi 
456    jkl, mnopqr, stuv 
789    w, xyz 

Ausgabe

Account Numbers Loans 
123    abc 
123    def 
123    ghi 
456    jkl 
456    mnopqr 
456    stuv 
789    w 
789    xyz 

Kredite durch Kommata getrennt sind und sie keine feste Länge haben.

+0

Mögliche Duplikat [SAS Transponieren Comma Separated Feld] (http://stackoverflow.com/questions/28358093/sas-transpose-comma-separated-field) – Reeza

Antwort

1

Verwenden Sie countw(), um die Anzahl der Werte in einer Zeile zu zählen, und scan(), um sie auszuwählen.

Beide haben eine letzte optionale Variable, um das Trennzeichen zu spezifizieren, welches in Ihrem Fall , ist.

data Loans (keep= AccountNo Loan); 
    infile datalines truncover; 
    Input @1 AccountNo 3. @17 LoanList $250.; 
    if length(LoanList) gt 240 then put 'WARNING: You might need to extend Loans'; 

    label AccountNo = 'Account Number' Loan = 'Loans'; 
    do loanNo = 1 to countw(LoanList, ','); 
     Loan = scan(LoanList, loanNo, ','); 
     output; 
    end; 
    datalines; 
123    abc, def, ghi 
456    jkl, mnopqr, stuv 
789    w, xyz 
; 

proc print data=Loans label noobs; 
run; 

Der umgekehrte Vorgang erfordert verschiedene Techniken.

Um die Verarbeitung von by AccountNo zu ermöglichen, müssen wir zunächst ein SAS-Dataset aus der Eingabe erstellen und dieses dann mit einer set-Anweisung zurückgelesen.

data Loans; 
    infile datalines; 
    input @1 AccountNo 3. @5 Loan $25.; 
    datalines; 
123 15-abc 
123 15-def 
123 15-ghi 
456 99-jkl 
456 99-mnopqr 
456 99-stuv 
789 77-w 
789 77-xyz 
; 
data LoanLists; 
    set Loans; 
    by AccountNo; 

Jetzt ist Ihre Loanlist lange genug schaffen und das Standardverhalten von SAS überschreiben alle Variablen für jede Beobachtung neu zu initialisieren (= Datenreihe).

format Loanlist $250.; 
    retain Loanlist; 

Sammeln Sie alle Kredite für ein Konto, trennen Sie sie mit Komma ein Leerzeichen.

if first.AccountNo then Loanlist = Loan; 
    else Loanlist = catx(', ',Loanlist,Loan); 
    if length(LoanList) gt 240 then put 'WARNING: you might need to extend LoanList'; 

halten nur die vollständige Liste pro Konto.

if last.AccountNo; 
    drop Loan; 
proc print; 
run; 
+0

Thank you so viel, COUNTW und Scan-Funktion haben Arbeit – user3681328

+0

Bitte lassen Sie mich wissen, was passiert, wenn ich den Prozess umkehren möchte? – user3681328

+0

Die Annahme oder Abstimmung meiner Antwort würde helfen. –

Verwandte Themen