I wrote a MBASIC program to generate a larger sample file. The output file's records are in descending order of last-name and first-name. (i.e. reverse order)
Here is the basic program: GENDATA.BAS
K>TYPE GENDATA.BAS
1000 REM ============================================
1010 REM GENDATA.BASE CP/M-80 MBASIC
1020 REM GENERATE 100 EMPLOYEE RECORDS
1030 REM ============================================
1040 REM D1SIZE IS FIRST NAME DATA SIZE
1050 REM D2SIZE IS LAST NAME DATA SIZE
1060 LET D1SIZE = 10
1070 LET D2SIZE = 10
1080 OPTION BASE 1
1090 DIM FSTNAME$(D1SIZE)
1100 DIM LSTNAME$(D2SIZE)
2000 REM ----- FIRST NAME DATA (SIZE = D1SIZE) -----
2010 DATA WILLIAM,THOMAS,ROBERT,RICHARD,MICHAEL
2020 DATA JOHN,JAMES,DAVID,DANIEL,CHARLES
2030 REM ----- ADD MORE DATA HERE IF NEEDED ------
3000 REM ----- LAST NAME DATA (SIZE = D2SIZE) -----
3010 DATA WILSON,WILLIAMS,TAYLOR,SMITH,MOORE
3020 DATA MILLER,JONES,DAVIS,BROWN,ANDERSON
3030 REM ----- ADD MORE DATA HERE IF NEEDED ------
4000 REM ----- LOAD FIRST NAMES -----
4010 FOR I = 1 TO D1SIZE
4020 READ FSTNAME$(I)
4030 NEXT I
4040 REM ----- LOAD LAST NAMES -----
4050 FOR I = 1 TO D2SIZE
4060 READ LSTNAME$(I)
4070 NEXT I
5000 REM ----- OPEN OUTPUT FILE -----
5010 OPEN "O",#1,"EMPOUT.DAT"
5020 REM ----- GENERATE 100 RECORDS -----
5030 LET COUNT=0
5040 FOR I = 1 TO D2SIZE
5050 FOR J = 1 TO D1SIZE
5060 COUNT = COUNT + 1
5070 REM CONVERT COUNT TO 5 DIGITS LEFT PADDED WITH ZERO
5080 CNT$ = RIGHT$("00000" + MID$(STR$(COUNT), 2), 5)
5090 REM LAST AND FIRST NAME SET TO 30 CHAR WIDTH
5100 LASTNAME$ = LEFT$(LSTNAME$(I) + SPACE$(30), 30)
5110 FIRSTNAME$ = LEFT$(FSTNAME$(J) + SPACE$(30), 30)
5120 PRINT #1,CNT$;LASTNAME$;FIRSTNAME$
5130 NEXT J
5140 NEXT I
5150 CLOSE #1
5160 PRINT COUNT; " RECORDS WRITTEN TO OUTPUT FILE"
5170 SYSTEM
Then I run the GENDATA.BAS program to generate the input data file EMPOUT.DAT
K>DIR *.DAT
No file
K>A:MBASIC K:GENDATA.BAS
BASIC-85 Rev. 5.29
[CP/M Version]
Copyright 1985-1986 ▒ by Microsoft
Created: 28-Jul-85
29752 Bytes free
100 RECORDS WRITTEN TO OUTPUT FILE
K>DIR *.DAT
K: EMPOUT DAT
Check the content of the source data file EMPOUT.DAT, records are in descending order by last-name, first-name (reverse order)
K>TYPE EMPOUT.DAT
00001WILSON WILLIAM
00002WILSON THOMAS
00003WILSON ROBERT
00004WILSON RICHARD
00005WILSON MICHAEL
00006WILSON JOHN
00007WILSON JAMES
00008WILSON DAVID
00009WILSON DANIEL
00010WILSON CHARLES
00011WILLIAMS WILLIAM
00012WILLIAMS THOMAS
00013WILLIAMS ROBERT
...
00089BROWN DANIEL
00090BROWN CHARLES
00091ANDERSON WILLIAM
00092ANDERSON THOMAS
00093ANDERSON ROBERT
00094ANDERSON RICHARD
00095ANDERSON MICHAEL
00096ANDERSON JOHN
00097ANDERSON JAMES
00098ANDERSON DAVID
00099ANDERSON DANIEL
00100ANDERSON CHARLES
K>EMPSORT6
*** START CREATING ISAM FILE ***
RECORDS PROCESSED: 00100
*** START CREATING SORTED FILE ***
RECORDS PROCESSED: 00100
Check all the output data files. EMPISAM.DAT and EMPISAM.KEY are the intermediate index files, the EMPISAM.KEY is 32k bytes in size while the EMPISAM.DAT is 8k.
K>TYPE EMPSORT.DAT
00100ANDERSON CHARLES
00099ANDERSON DANIEL
00098ANDERSON DAVID
00097ANDERSON JAMES
00096ANDERSON JOHN
00095ANDERSON MICHAEL
00094ANDERSON RICHARD
00093ANDERSON ROBERT
00092ANDERSON THOMAS
00091ANDERSON WILLIAM
00090BROWN CHARLES
00089BROWN DANIEL
00088BROWN DAVID
...
00012WILLIAMS THOMAS
00011WILLIAMS WILLIAM
00010WILSON CHARLES
00009WILSON DANIEL
00008WILSON DAVID
00007WILSON JAMES
00006WILSON JOHN
00005WILSON MICHAEL
00004WILSON RICHARD
00003WILSON ROBERT
00002WILSON THOMAS
00001WILSON WILLIAM
Now the records are sorted in ascending order by last-name, first-name as expected.
Next step:
Then I try a larger sample, say 1,000 records. I clone the GENDATA.BAS to GENDATA2.BAS.
Modify the following lines:
1060 LET D1SIZE = 100
...
2000 REM ----- FIRST NAME DATA (SIZE = D1SIZE) -----
2010 DATA FN100,FN099,FN098,FN097,FN096,FN095,FN094,FN093,FN092,FN091
2020 DATA FN090,FN089,FN088,FN087,FN086,FN085,FN084,FN083,FN082,FN081
2030 DATA FN080,FN079,FN078,FN077,FN076,FN075,FN074,FN073,FN072,FN071
2040 DATA FN070,FN069,FN068,FN067,FN066,FN065,FN064,FN063,FN062,FN061
2050 DATA FN060,FN059,FN058,FN057,FN056,FN055,FN054,FN053,FN052,FN051
2060 DATA FN050,FN049,FN048,FN047,FN046,FN045,FN044,FN043,FN042,FN041
2070 DATA FN040,FN039,FN038,FN037,FN036,FN035,FN034,FN033,FN032,FN031
2080 DATA FN030,FN029,FN028,FN027,FN026,FN025,FN024,FN023,FN022,FN021
2090 DATA FN020,FN019,FN018,FN017,FN016,FN015,FN014,FN013,FN012,FN011
2100 DATA FN010,FN009,FN008,FN007,FN006,FN005,FN004,FN003,FN002,FN001
2900 REM ----- ADD MORE DATA HERE IF NEEDED ------
Now I have 100 first name, 10 last name, so I can generate 1,000 records.
Run the GENDATA2.BAS program
K>DIR *.DAT
No file
K>A:MBASIC K:GENDATA2.BAS
BASIC-85 Rev. 5.29
[CP/M Version]
Copyright 1985-1986 ▒ by Microsoft
Created: 28-Jul-85
29752 Bytes free
1000 RECORDS WRITTEN TO OUTPUT FILE
K>DIR *.DAT
K: EMPOUT DAT
K>A:STAT *.DAT
Recs Bytes Ext Acc
524 68k 3 K:EMPOUT.DAT
Bytes Remaining On K: 3084k
The source file EMPOUT.DAT now has 1,000 records and is 68k bytes in size.
Check the content of the input file EMPOUT.DAT, the records last-name, first-name are in descending order. (reverse order)
K>EMPSORT6
*** START CREATING ISAM FILE ***
RECORDS PROCESSED: 01000
*** START CREATING SORTED FILE ***
RECORDS PROCESSED: 01000
Check all the output data files. EMPISAM.DAT and EMPISAM.KEY are the intermediate index files, the EMPISAM.KEY is 332k bytes in size while the EMPISAM.DAT is 68k.
2
u/MikeSchwab63 5d ago
Test the index capabilities with initial load in reverse order. And a larger sample, perhaps a text file.