SAS 4GL (ang.SAS Institute 4th Generation Language - język 4 generacji Instytutu SAS) -język programowania pakietu statystycznegoSAS.
SAS4GL wbrew nazwie, sugerującej wysoki poziom abstrakcji, nie jestjęzykiem obiektowym (w wersji 9 wprowadzono "obiektową" składnię dla dwóch predefiniowanych obiektów – hash i hashiterator, ale nadal nie można tworzyć własnych klas). Nie ma nawet definiowalnych przez użytkownikaprocedur w sensie klasycznych języków programowania (zamiast nich dostępny jest rozbudowany systemmakr, własne funkcje użytkownika o ograniczonym zastosowaniu wprowadzono w wersji 9.1). Ma jednak wbudowane polecenia, zwane tutaj procedurami, realizujące potężny zasób algorytmów statystyki i analizy danych. Dobrze radzi sobie z dużymi zbiorami danych o milionach rekordów. Umożliwia pracę w trybieklient-serwer.
SAS ma dwa prostetypy danych:
Długość tekstu oraz liczbę bajtów zmiennej liczbowej można ustawiać odpowiednimi instrukcjami.Można także ustawić tzw.format - sposób prezentacji zmiennej na ekranie orazinformat - sposób ładowania zmiennej z pliku tekstowego.
Ponadto w data stepie (opisanym dalej) można grupować zmienne w tablice. W wersji 9 wprowadzonotablice haszujące.
W obrębie niektórych procedur oferowane są podjęzyki z własnymi typami o zasięgu ograniczonym do tych procedur, np. procedura FCMP oferuje struktury zjęzyka C, a procedura IML arytmetykęmacierzy.
Data step jest blokiem instrukcji odpowiedzialnym za przetwarzanie danych krok po kroku.Najprostsza jego forma:
datatabela_wynikowa;settabela_wejściowa;...przetwarzanie...run;
Gdzie "... przetwarzanie ..." oznacza dowolny ciąg instrukcji operujących na jednym wierszu z tabeli wejściowej i produkujących jeden wiersz tabeli wyjściowej.
run jest instrukcją kończącą blok data step.
Przetwarzając data step SAS utrzymuje w pamięciwektor bieżących wartości zmiennych.Instrukcje są wykonywane kolejno od początku do słowa run
Natrafienie w data stepie na słowo kluczowe
settabela1[tabela2...];
powoduje załadowanie do wektora zmiennych kolejnego wiersza z tabelitabela1. Jeśli zmienna o tej samej nazwie co dana kolumna w tabeli już istnieje, jest nadpisywana.Kiedy skończy się tabela 1, ładowane są dane z tabeli 2, itd.Próba załadowania danych, kiedy skończą się wiersze we wszystkich tabelach powoduje przerwanie działania data stepu (i jest to najczęstszy sposób jego zakończenia).
W data stepie może być wiele instrukcji set. Każda z nich stanowi osobnykursor.
Można sprawdzić, czy bieżący wiersz jest ostatnim:
settabela1[tabela2...]end=zmienna;
Wartość zadanej zmiennej zostanie ustawiona na 1 jeśli przetwarzany jest ostatni wiesz ze wszystkich tabel. W przeciwnym wypadku wyniesie 0.
Można też sprawdzać, która tabela jest przetwarzana podając po niej w nawiasach (in=zmienna). Zadana zmienna jest wówczas ustawiana na 1, gdy przetwarzany jest jakikolwiek wiersz z tej tabeli.
zmienna=wyrażenie;
przypisuje wartość do danej zmiennej, dodając ją (jeśli potrzeba) do wektora zmiennych.
ifwarunektheninstrukcja1;[elseinstrukcja2;]
wykonuje instrukcję 1 gdy warunek jest spełniony, i 2 jeśli nie jest.
ifwarunek;
sprawdza warunek, i jeśli nie jest spełniony wraca na początek data stepu, bez dalszego przetwarzania danych.
Blok kodu można ująć pomiędzydo iend. Jest wtedy traktowany jak jedna instrukcja.
do;....end;
Instrukcje te pozwalają też na tworzenie pętli, np.:
doi=1tokby2;doa=ito0by-1;dou=ato5;....end;end;end;dowhile(a=b);....end;
Instrukcja
byzmienna1[zmienna2...];
jest globalna dla całego data stepu. Nie ma znaczenia w którym miejscu wystąpi.By powoduje zmianę działania instrukcjiset (a także opisanej dalejmerge) - dane będą wczytywane nie najpierw z pierwszej tabeli, potem z drugiej itd, lecz w kolejności według zmiennej 1, następnie (jeśli wartości zmiennej1 były równe) według zmiennej 2, itd.
Jeśli którakolwiek tabela nie jest posortowana ani poindeksowana według tych zmiennych, zostanie zgłoszony błąd.
Jeśli użyto instrukcjiby, można stosować konstrukcje:
itd.
Instrukcjamerge działa tak jakset, jednak wczytuje jednocześnie po jednym wierszu z każdej tabeli. Służy do łączenia danych z różnych źródeł.
Jeśli nie użytoby, wiersze są łączone na zasadzie: pierwszy wiersz każdej tabeli z pierwszym wierszem każdej innej, drugi z drugim, itd.
Jeśli użyto instrukcjiby, wiersze będą łączone wedługkluczy wymienionych wby. Jeśli w którejś z tabel zabraknie wiersza o identyfikatorze występującym w jakiejś innej tabeli, jej zmienne zostaną wypełnione wartością pustą, oznaczaną w SAS-ie przez kropkę.(in=zmienna) użyte przy tej tabeli zwróci wówczas zero.
Merge zby działa analogicznie do instrukcjifull join w językuSQL (z zastrzeżeniem, że rozważane są tylko łączenia w relacji 1-do-1 lub 1-do-n[1]).Używając konstrukcji(in=zmienna) orazif możemy zasymulować "join"left join alboright join:
datawynik;mergetabela1(in=in1)tabela2;byid;ifin1;run;
Równoważny kod SQL:
createtablewynikasselect*fromtabela1asaleftjointabela2asbona.id=b.idorderbyid;
Instrukcjaoutput powoduje umieszczenie jednego wiersza w tabeli wynikowej. Jeśli w data stepie nie ma ani jednej instrukcjioutput, zostanie ona domyślnie dodana na końcu.
O tym, które zmienne z wektora zmiennych znajdą się w zbiorze wynikowym możemy zadecydować używając instrukcjikeep idrop:
keepzmienna1[zmienna2...];dropzmienna1[zmienna2...];output;
Data step może wytwarzać więcej niż jedną tabelę naraz. Wówczas wszystkie tabele muszą być wymienione we fraziedata, a pooutput możemy podać, do których tabel ma trafić wiersz wyniku.keep idrop dotyczą wszystkich tabel, można jednak różnicować zmienne trafiające do każdej z nich, za pomocą fraz(keep=zmienna1 [zmienna2...]) i(drop=zmienna1 [zmienna2...]) umieszczanych po nazwie tabeli w instrukcjidata.
Instrukcja występująca na końcu kodu data stepu. Powoduje przejście z powrotem na początek data stepu. Kasuje przy tym wektor zmiennych (wypełnia go wartościami brakującymi).Aby uchronić zmienną przed skasowaniem, można ją wymienić w instrukcji:
retainlistazmiennych;
umieszczonej gdziekolwiek w data stepie.W retain można też podać początkowe wartości zmiennych.
Słowo procedura w SAS-ie znaczy co innego niż w innych językach. Procedura nie jest definiowana przez użytkownika, lecz zaszyta w systemie i możliwa tylko do wywołania.Ich składnia zależy od konkretnej procedury. Spośród kilkuset podano poniżej kilka najczęściej używanych. Każda z nich ma mnóstwo opcji, które nie będą tu już opisywane.
Sortowanie tabeli.
procsortdata=nazwa_tabeli;byzmienna1[zmienna2...];run;
Umożliwia użycie w SAS wstawek SQL.
procsql;dowolnykodsqlquit;
Wyświetla ile razy wystąpiła dana wartość danej zmiennej, albo kombinacja wartości kilku zmiennych.
Przykład:
procfreqdata=tabela;tableszmienna1zmienna2zmienna3*zmienna4;run;
procregdata=tabela;modelzmienna_objaśniana=zmienna_objaśniająca1zmienna_objaśniająca2...;run;
SAS oferuje predefiniowane funkcje (matematyczne, tekstowe, statystyczne, itp.) możliwe do użycia w data stepach i niektórych procedurach (w szczególności SQL). Własne funkcje i podprogramy można tworzyć począwszy od wersji SAS 9.1 za pomocą procedury FCMP[2]. Mogą być one wykonywane w data stepach i niektórych procedurach, ale same nie mogą data stepów i procedur wywoływać.
Prawdziwym odpowiednikiem procedur w SASie nie są instrukcje PROC, ani podprogramy FCMP lecz makrodefinicje. SAS ma bardzo rozbudowanypreprocesor, który pozwala m.in. dynamicznie zmieniać treść programu w trakcie jego wykonania orazrekurencyjnie zagnieżdżać makra.
SAS w środowisku statystyków jest często chwalony za swe rozbudowane możliwości.
Z drugiej strony kilka jego cech budzi raczej krytykę.
labelzmienna='xyz';
labelzmienna='';
labelzmienna=' ';
%macrotest;%if10.5>2%then%puttak;%else%putnie;%mend;%test;
%macrotest;%if%sysevalf(10.5>2)%then%puttak;%else%putnie;%mend;%test;
SAS Institute oferuje dwa certyfikaty ze znajomości SAS 4GL:
| 1GL | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2GL/ Język drugiej generacji/ Asembler | |||||||||||||||
| 3GL / Język trzeciej generacji |
| ||||||||||||||
| 4GL/ Język czwartej generacji/ Język dziedzinowy |
| ||||||||||||||
| 5GL/Logiczne | |||||||||||||||
| Ezoteryczne | |||||||||||||||
| Inne |