10 REM > Names
   20 REM Example of processing standard Census CSV file
   30 :
   40 match$="NAME"    :REM Field to count
   50 match$="SURNAME" :REM Field to count
   60 verbose%=TRUE
   70 max%=23:datamax%=1200:year%=1951
   80 DIM head$(max%),info$(max%),data$(datamax%),data%(datamax%)
   90 FOR A%=0 TO max%:READ head$(A%):NEXT
  100 DATA "HOUSEHOLD NUMBER","SURNAME","NAME","AGE","RELATION","GENDER","MARITAL STATUS","STREET ADDRESS"
  110 DATA "OCCUPATION","BIRTH PLACE","BIRTH YEAR","INDIVIDUAL NUMBER","CIVIL PARISH","COUNTY/ISLAND","COUNTRY"
  120 DATA "REGISTRATION DISTRICT","REGISTRATION DISTRICT NUMBER","SUB-REGISTRATION DISTRICT"
  130 DATA "ED, INSTITUTION, OR VESSEL","PIECE","FOLIO","POSTCODE","PD","POLL"
  140 :
  150 OFF:ON ERROR REPORT:PROCClose_All:PRINT" at line ";ERL:IF ERR=17:QUIT ELSE ON:END
  160 :
  170 in%=OPENIN("..\"+STR$year%+"\Whitby"+STR$year%+".csv")
  180 IF in%=0:in%=OPENIN("..\"+STR$year%+"\Whitby"+STR$(year%-2)+".csv")
  190 :
  200 PROCcsv_rd(in%,info$())                :REM Find column to count
  210 match%=-1:REPEAT:match%=match%+1:UNTIL info$(match%)=match$ OR match%=max%
  220 IF info$(match%)<>match$:PRINT"Couldn't find field to match":END
  230 :
  240 REPEAT
  250   PROCcsv_rd(in%,info$())
  260   IF info$(1)<>"":PROCprocess
  270 UNTILEOF#in%
  280 CLOSE#in%:in%=0
  290 PROCSort
  300 *Spool out.txt
  310 A%=0:REPEAT
  320   REM IF data$(A%)<>"":PRINT;data$(A%)
  330   IF data$(A%)<>"":PRINT;data%(A%);" ";data$(A%)
  340 A%=A%+1:UNTILA%>datamax%
  350 *Spool
  360 QUIT
  370 :
  380 DEFPROCprocess
  390 REM IF info$(5)<>"Female":ENDPROC
  400 A$=info$(match%)
  410 IF A$="vacant":ENDPROC
  420 A%=INSTR(A$,"-"):IF A%=0:A%=INSTR(A$+" "," ")
  430 A$=LEFT$(A$,A%-1)
  440 A%=-1:REPEAT:A%=A%+1:UNTIL data$(A%)="" OR data$(A%)=A$ OR A%>=datamax%
  450 IF A%>=datamax%:PRINT CHR$13;"Too much data";:ENDPROC
  460 IF data$(A%)="":data$(A%)=A$
  470 data%(A%)=data%(A%)+1
  480 :
  490 IF verbose% THEN
  500   VDU30:A%=0:REPEAT
  510     IF data%(A%)>4:PRINT;data%(A%);" ";data$(A%);SPC(23-LENdata$(A%))
  520     A%=A%+1
  530   UNTIL data$(A%)="" OR A%>=datamax% OR VPOS>29
  540 ENDIF
  550 ENDPROC
  560 :
  570 DEFPROCSort
  580 LOCAL i%,j%,tmp$:n%=datamax%
  590 FOR i%=0 TO n%-2
  600   FOR j%=0 TO n%-2-i%
  610     IF data%(j%+1) > data%(j%):SWAP data$(j%+1),data$(j%):SWAP data%(j%+1),data%(j%)
  620   NEXT
  630 NEXT
  640 ENDPROC
  650 :
  660 DEFPROCClose_All
  670 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
  680 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  690 ENDPROC
  700 :
  710 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
  720 DEFFNuc(A$):LOCAL B$:IFA$="":=""
  730 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
  740 DEFFNlc(A$):LOCAL B$:IFA$="":=""
  750 REPEATB$=B$+CHR$(ASCA$OR((A$<"_")AND&20)):A$=MID$(A$,2):UNTILA$="":=B$
  760 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
  770 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
  780 =A$
  790 :
  800 DEFPROCcsv_rd(i%,array$())
  810 LOCAL n%:n%=0:array$()="":A$=GET$#i%:IFA$="":A$=GET$#i%
  820 A$=A$+","
  830 REPEAT
  840   IF LEFT$(A$,2)="=""":A$=MID$(A$,2)
  850   IF LEFT$(A$,1)="""" THEN
  860     A%=INSTR(A$,""",",2)+1:array$(n%)=MID$(A$,2,A%-3)
  870   ELSE
  880     A%=INSTR(A$,","):array$(n%)=LEFT$(A$,A%-1)
  890   ENDIF
  900   A$=MID$(A$,A%+1):n%=n%+1
  910 UNTILA$=""
  920 ENDPROC
  930 :
  940 DEFPROCcsv_wr(o%,array$())
  950 LOCAL n%,q%:n%=DIM(array$(),1)
  960 FOR A%=0 TO n%:A$=array$(A%)
  970   q%=INSTR(A$,",")
  980   IF q%=0:q%=(ASCA$=48)AND(INSTR(A$,"/")=0)     :REM leading zeros 00001
  990   IF q%=0:IFVALLEFT$(A$,1):q%=INSTR(A$,"E")     :REM preserve 1234E5678
 1000   IF q%=0:q%=LENSTR$VALA$>8                     :REM long numbers 12345678901234
 1010   IF q%=0:IFVALA$:q%=INSTR(A$,"/")AND(ASCA$<>48):REM fractions 12/34
 1020   IF q%=0:q%=LEFT$(A$,1)="-"                    :REM leading hyphen -
 1030   IF q%=0:q%=MID$(A$,3,1)=" "ANDMID$(A$,7,1)=" ":REM dates xx XXX xxxx
 1040   IF q%:A$=""""+A$+"""":IFINSTR(A$,",")=0:A$="="+A$
 1050   BPUT#o%,A$;:IF A%<>n%:BPUT#o%,",";
 1060 NEXT A%:BPUT#o%,""
 1070 ENDPROC