Используйте countw()
, чтобы подсчитать количество значений по строке и scan()
, чтобы выбрать их.
Оба имеют последнюю необязательную переменную, чтобы указать разделитель, который в вашем случае равен ,
.
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;
Для обратной работы требуются различные методы.
Чтобы разрешить обработку by AccountNo
, мы должны сначала построить набор данных SAS с входа, а затем прочитать это с помощью инструкции set
.
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;
Теперь создать Loanlist достаточно долго, и перезаписывать поведение по умолчанию SAS повторно инициализировать все переменные для каждого наблюдения (= строка данных).
format Loanlist $250.;
retain Loanlist;
Соберите все ссуды на счет, разделив их запятой на пробел.
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';
Храните только полный список учетных записей.
if last.AccountNo;
drop Loan;
proc print;
run;
Возможный дубликат [SAS Транспонирование Comma Расстались поле] (http://stackoverflow.com/questions/28358093/sas-transpose-comma-separated-field) – Reeza