1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
* Автор: Raynald Levesque, rlevesque@videotron.ca 
* 10 ноября 2000.
* www.spsstools.net
*.

* Следующий файл содержит интервалы телефонных номеров, закреплённых за организациями и(или) территориями.
GET
  FILE='C:\\temp\\ExampleRDD.sav'.

* Число в теле макроса !nb - это желаемое число телефонных номеров для генерации в пределах интервала номеров.
* Разумеется, если разность между старшими и младшими разрядами номеров в телефонной книге
* меньше, чем желаемое число номеров, то все номера из интервала будут включены в выборку.
DEFINE !nb()500!ENDDEFINE.

COMPUTE casen=$casenum.
COMPUTE delta = NUMBER(uprange,F8.0) - NUMBER(lowrange,F8.0)+1.
STRING lowr upr (A4) #tmp(A1).

* Я полагаю, что номер АТС (exchange) всегда состоит из 3 или 4 цифр.
DO IF length(RTRIM(lowrange))=4.
+	COMPUTE lowr=lowrange.
+	COMPUTE upr=uprange.
ELSE.
+	COMPUTE #tmp=SUBSTR(exchange,4).
+	COMPUTE lowr=CONCAT(#tmp,lowrange).
+	COMPUTE upr=CONCAT(#tmp,uprange).
END IF.
EXECUTE.

LOOP cnt=1 TO delta.
LEAVE ALL.
XSAVE OUTFILE='c:\\temp\\numbers.sav' .
END LOOP.
EXECUTE.

GET FILE='c:\\temp\\numbers.sav' .
COMPUTE rv=UNIFORM(1).
RANK
  VARIABLES=rv  (A) BY casen  /RANK /PRINT=NO
  /TIES=MEAN .

SELECT IF (rrv<=min(!nb,delta)).
STRING phonenb(A10).
COMPUTE phonenb=CONCAT(SUBSTR(dialcode,1,3),SUBSTR(exchange,1,3),STRING(NUMBER(lowr,F8.0)+cnt-1,N4.0)).

*Убираем лишнее.
MATCH FILES FILE=* /DROP=casen TO rrv.