10 REM > DownToCSV
   20 REM Extract data from 1939 Residents Register downloads
   30 :
   40 sort%=FALSE
   50 verbose%=TRUE
   60 max%=19:year%=1939:month%=9:day%=29:minfsize%=20*1024
   70 :
   80 A%=0:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
   90 s$=".":fmax%=255:IFos%AND32:d$="\" ELSE IFos%AND8:d$="/" ELSE s$="/":d$=".":fmax%=10
  100 DIM head$(max%),info$(max%),len%(max%)
  110 FOR A%=0 TO max%:READ head$(A%):NEXT
  120 DATA "HOUSEHOLD NUMBER","SURNAME","NAME","AGE","RELATIONSHIP","SEX","MARITAL STATUS","STREET ADDRESS"
  130 DATA "OCCUPATION","BIRTH YEAR","BIRTH PLACE","BIRTH COUNTY","BIRTH COUNTRY","INDIVIDUAL NUMBER"
  140 DATA "CIVIL PARISH","SUB-REGISTRATION DISTRICT","ENUMERATION DISTRICT","PIECE","PAGE","FOLIO"
  150 :
  160 ON ERROR REPORT:PROCClose_All:PRINT" at line ";ERL:END:IF ERR=17:QUIT ELSE END
  170 out$=LEFT$("Whitby1939"+s$+"csv",fmax%):out%=OPENOUT(out$)
  180 IF out%=0:PRINT"Couldn't open output file, is it already open?":END
  190 :
  200 PROCcsv_wr(out%,head$())
  210 IF verbose%:CLS:PRINT':FOR A%=0 TO max%:PRINTFNd0(A%,2);": ";head$(A%);":":NEXT
  220 head$(4)="RELATION"
  230 :
  240 IF verbose%:OFF
  250 last$="":lastH$="":lastI$="":ed$="@"
  260 FOR a%=3265 TO 3266
  270   FOR b%=ASC"A" TO ASC"M"
  280     FOR c%=01 TO 25
  290       dir$=STR$a%+CHR$b%+"-"+FNd0(c%,2)
  300       FOR d%=1 TO 44
  310         item$=STR$a%+CHR$b%+FNd0(c%,2)+FNd0(d%,2)
  320         leaf$=STR$a%+CHR$b%+"-"+FNd0(c%,2)+"-"+FNd0(d%,2)
  330         file$="Downloads"+d$+dir$+d$+leaf$+s$+"htm"
  340         IF verbose%:VDU 30:PRINT SPC4;file$;
  350         in%=OPENIN(file$):IF in%:PROCscan:IF in%:PROCprocess:IF in%:CLOSE#in%:in%=0
  360       NEXT d%
  370     NEXT c%
  380   NEXT b%
  390 NEXT a%
  400 :
  410 file$="empty"+s$+"csv"
  420 REM ADDRESS, HOUSEHOLD, INDIVIDUAL, IMAGE, LINE, ED CODE
  430 REM PAGE=IMAGE+1
  440 in%=OPENIN(file$)
  450 IF in% THEN
  460   A$=FNrd(in%)                                 :REM Header
  470   REPEAT
  480     PROCcsv_rd(in%,info$())
  490     IF info$(0)<>"" THEN
  500       street$=info$(0)
  510       house$=FNd0(VALinfo$(1),4)
  520       idnum$=FNuc(info$(2))
  530       page%=VALinfo$(3)
  540       line%=VALinfo$(4)
  550       ed$=info$(5)
  560       IF page%:idnum$=LEFT$(idnum$,5)+FNd0(page%+1,2)+FNd0(line%,2)
  570       info$()=""
  580       info$(0) =house$+"/00"                     :REM HOUSEHOLD NUMBER
  590       info$(1) ="vacant"                         :REM SURNAME
  600       info$(7) =street$                          :REM STREET ADDRESS
  610       info$(13)=idnum$                           :REM INDIVIDUAL NUMBER
  620       info$(14)="Whitby"                         :REM CIVIL PARISH
  630       info$(15)="Whitby"                         :REM SUB-REGISTRATION DISTRICT
  640       info$(16)=ed$                              :REM ENUMERATION DISTRICT
  650       info$(17)="RG101/"+LEFT$(idnum$,5)         :REM PIECE
  660       info$(18)=FNd0(page%+2,3)+"/"+FNd0(line%,2):REM PAGE
  670       PROCprocess
  680     ENDIF
  690   UNTIL EOF#in%:CLOSE#in%:in%=0
  700 ENDIF
  710 CLOSE#out%:out%=0:ON
  720 IF sort%:IF verbose%:PRINTCHR$30;SPC40;CHR$30;SPC4;"Sorting...";
  730 REM IF sort%:OSCLI "Run ..\Tools\CSVSort "+out$+" 0:16"
  740 IF sort%:OSCLI "Run ..\Tools\CSVSort "+out$+" 17:0:18"
  750 QUIT
  760 :
  770 DEFPROCscan
  780 REM IF EXT#in%<minfsize%:CLOSE#in%:in%=0:OSCLI"Delete "+file$:ENDPROC
  790 :
  800 REM Arrange in output array
  810 line$=""
  820 info$()=""
  830 REM info$(4) =""                        :REM RELATIONSHIP
  840 REM info$(10)=""                        :REM BIRTH PLACE
  850 REM info$(11)=""                        :REM BIRTH COUNTY
  860 REM info$(12)=""                        :REM BIRTH COUNTRY
  870 info$(14)="Whitby"                      :REM CIVIL PARISH
  880 REM info$(15)="Whitby"                  :REM SUB-REGISTRATION DISTRICT
  890 REM info$(16)=ed$                       :REM ENUMERATION DISTRICT
  900 :
  910 REPEAT
  920   field$="":a$=FNs(FNrd(in%)):IFRIGHT$(a$,1)=",":a$=LEFT$(a$,LENa$-1)
  930   A%=INSTR(a$,":"):IFA%:field$=LEFT$(a$,A%-1):a$=FNs(MID$(a$,A%+1))
  940   field$=FNnoquote(field$):a$=FNnoquote(a$)
  950   A%=INSTR(a$,"&"):IFA%:a$=LEFT$(a$,A%-1)+"&"+MID$(a$,A%+5)
  960   IF a$="null":a$=""
  970   IF a$="-":a$=""
  980   :
  990   IF field$="Schedule"                :info$(0)=a$            :REM Household
 1000   IF INSTR(a$,"data-id=""Schedule"">"):IFinfo$(0)="":A%=INSTR(a$,">"):info$(0)=FNnohtml(MID$(a$,A%+1))
 1010   IF field$="LastNameS"               :info$(1)=a$            :REM Surname
 1020   IF field$="FirstNameS"              :info$(2)=a$            :REM Given name
 1030   IF field$="Relationship"            :info$(4)=a$            :REM Relationship
 1040   IF field$="Sex"                     :info$(5)=a$            :REM Sex
 1050   IF field$="MaritalStatus"           :info$(6)=a$            :REM Marital status
 1060   IF INSTR(a$,"fa-map-marker")        :info$(7)=FNnohtml(a$)  :REM Address
 1070   IF field$="Occupation"              :info$(8)=a$            :REM Occupation
 1080   IF field$="DOB"                     :info$(9)=a$            :REM Date of birth
 1090   IF field$="ScheduleSubNumber"       :info$(13)=a$           :REM Item within household
 1100   IF field$="EnumDistrict"            :info$(16)=a$           :REM Enumeration district
 1110   IF INSTR(a$,"transcriptPlace")      :IFinfo$(15)="":A$=FNnohtml(FNs(FNrd(in%))):info$(15)=LEFT$(A$,INSTR(A$+" "," ")-1)
 1120   IF INSTR(field$,"refedcode")        :a$=FNnohtml(a$):info$(17)=LEFT$(a$,INSTR(a$+" "," ")-1):REM Piece
 1130   :
 1140 UNTIL EOF#in% OR info$(17)<>""
 1150 IF info$(0)="":info$(0)=lastH$
 1160 IF info$(13)="":IF info$(0)=lastH$:info$(13)=STR$(VALlastI$+1):REM No entry, create item number
 1170 IF info$(0)+info$(13)=lastH$+lastI$:CLOSE#in%:in%=0:ENDPROC
 1180 lastH$=info$(0):lastI$=info$(13)
 1190 info$(0)=FNd0(VALlastH$,4)+"/"+FNd0(VALlastI$,2)              :REM Household/subhouse
 1200 :
 1210 info$(13)=item$                                               :REM Individual number
 1220 REM                   3265A2019
 1230 REM                 3265A 20 19
 1240 REM id=TNA/R39/3265/3265A/20/19
 1250 :
 1260 REM Page and line
 1270 A%=INSTR(info$(17),"/",1+INSTR(info$(17),"/")):line$=MID$(info$(17),A%+1):info$(17)=LEFT$(info$(17),A%-1)
 1280 IFLENline$=5:line$=LEFT$(line$,4)+"0"+RIGHT$(line$,1)
 1290 info$(18)=line$
 1300 info$(19)="":REM folio
 1310 :
 1320 REM Enumeration district
 1330 IF info$(0)="0001/01":ed$=CHR$(ASCed$+1)
 1340 IF info$(16)="":info$(16)="JGT"+ed$
 1350 REM Calulated:
 1360 REM JGTA: 1 Borough Place       - 3265A
 1370 REM JGTB: 94 Church Street      - 3265B
 1380 REM JGTC: 15 Boulby Bank        - 3265D
 1390 REM JGTD: 2/2a Golden Lion Bank - 3265G
 1400 REM JGTE: 12 Bagdale            - 3265H
 1410 REM JGTF: 8 Golden Lion Bank    - 3265I
 1420 REM JGTG: 10 McLacklin's Yard   - 3265J
 1430 REM In source file:
 1440 REM JGTH
 1450 REM JGTI
 1460 REM JGTJ
 1470 REM JGTK
 1480 REM JGTL
 1490 REM JGTM
 1500 ENDPROC
 1510 :
 1520 DEFPROCprocess
 1530 REM Calculate birth year
 1540 A$=FNuc(info$(9)):A%=year%-VALRIGHT$(A$,4):IF INSTR("OCT NOV DEC ",MID$(A$,4,4)):A%=A%-1
 1550 IF VALA$=30:IFMID$(A$,4,4)="SEP ":A%=A%-1
 1560 IF VALRIGHT$(A$,4):info$(3)=STR$A%
 1570 IF info$(3)="0":IF MID$(A$,4,3)="SEP":info$(3)=STR$(30-VALA$)+" days"
 1580 IF info$(3)="0":IF MID$(A$,4,3)="AUG":info$(3)="1 mth"
 1590 IF info$(3)="0":info$(3)=STR$(INSTR("JUL JUN MAY APR MAY FEB JAN DEC NOV OCT ",MID$(A$,4,4))DIV4+2)+" mths"
 1600 :
 1610 REM Get maiden name
 1620 A$=info$(1):REPEAT:A%=INSTR(A$,"("):IF A%:A$=MID$(A$,A%+1)
 1630 UNTIL A%=0:info$(1)=LEFT$(A$,INSTR(A$+")",")")-1)
 1640 :
 1650 REM Correct address errors
 1660 A$=info$(7)
 1670 IFINSTR(A$,"'"):REPEAT:A$=FNswap(A$,"'",""):UNTILINSTR(A$,"'")=0
 1680 IFINSTR(A$,""""):REPEAT:A$=FNswap(A$,"""",""):UNTILINSTR(A$,"""")=0
 1690 IFinfo$(13)>="3265A0314":IFinfo$(13)<="3265A0436":A%=INSTR(A$," "):A$=LEFT$(A$,A%)+"Blackburn's Yard"
 1700 IFinfo$(13)>="3265A0437":IFinfo$(13)<="3265A0519":A%=INSTR(A$," "):A$=LEFT$(A$,A%)+"Benson's Yard"
 1710 IFinfo$(13)>="3265D1127":IFinfo$(13)<="3265D1144":A%=INSTR(A$," "):A$=LEFT$(A$,A%)+"Church Street"
 1720 :
 1730 REM Ensure correct apostophication
 1740 RESTORE +0
 1750 READ B$:REPEAT
 1760   A$=FNswap(A$,"s "+B$,"'s "+B$)
 1770   READ B$
 1780 UNTILB$="*"
 1790 DATA B,C,G,L,P,S,T,Y,*
 1800 :
 1810 REM Correct spelling mistakes
 1820 A%=INSTR(A$,"&"):IF A%:IFMID$(A$,A%+1)=>"a":A$=LEFT$(A$,A%)+" "+LEFT$(A$,A%-2)+MID$(A$,A%+1)
 1830 A%=INSTR(A$,","):IF A%:IF MID$(A$,A%+1,1)<>" ":A$=LEFT$(A$,A%)+" "+MID$(A$,A%+1)
 1840 A$=FNswap(A$,"Abbotts","Abbot's")
 1850 A$=FNswap(A$,"Homer","Horner")
 1860 A$=FNswap(A$,"Arm's","Arms")
 1870 A$=FNswap(A$,"Step's","Steps")
 1880 A$=FNswap(A$,"Steps ","Steps, ")
 1890 A$=FNswap(A$,"Infant's","Infant")
 1900 A$=FNswap(A$,"Galle ","Gallery, ")
 1910 A$=FNswap(A$,"Garden's","Gardens")
 1920 A$=FNswap(A$,"Cresent","Crescent")
 1930 A$=FNswap(A$,"2 seymour","Seymour, 2")
 1940 A$=FNswap(A$,"Building's","Buildings")
 1950 A$=FNswap(A$,"Building","Buildings")
 1960 A$=FNswap(A$,"Buildings The","Buildings, The")
 1970 A$=FNswap(A$,"Marsdens Road","1 Marsden's Place")
 1980 A$=FNswap(A$,"Ghant","Ghaut")         :REM NB: 1-5,12=New Way Ghaut, 6-14=New Way
 1990 A%=INSTR(A$,"New Way"):IF A%:A$=LEFT$(A$,A%+6):IF VALA$=12 OR VALA$<6:A$=A$+" Ghaut"
 2000 A$=FNswap(A$,"Bailby","Boulby")
 2010 A$=FNswap(A$,"Ainoley","Ainsley")
 2020 A$=FNswap(A$,"Selfleda","Aelfleda")
 2030 A$=FNswap(A$,"Furner","Turner")
 2040 A$=FNswap(A$,"Michtle","Middle")
 2050 A$=FNswap(A$,"Rofery","The Ropery")
 2060 A$=FNswap(A$,"mafle House","Maple House")
 2070 A$=FNswap(A$,"Bldg's","Buildings")
 2080 A$=FNswap(A$," P M C",", Primitive Methodist C")
 2090 A$=FNswap(A$,"Blacksmith","Blacksmith's")
 2100 A$=FNswap(A$,"Ship Inn Church","Ship Inn, 31 Church")
 2110 A$=FNswap(A$,"Long Steps, High Walk","High Walk, Long Steps")
 2120 A$=FNswap(A$,"Long Steps, Middle Walk","Middle Walk, Long Steps")
 2130 A$=FNswap(A$," East Cliff",", East Cliff")
 2140 A$=FNswap(A$,"Brewster's Lane","Brewster Lane")
 2150 A$=FNswap(A$,"Abbeylunds Farm","Abbey Lands Farm, East Cliff")
 2160 A$=FNswap(A$,"11 Bank House Bridge Street","Bank House, 11 Bridge Street")
 2170 A$=FNswap(A$,"East Abbey Terrace East Abbey Terrace","East Abbey Terrace")
 2180 A$=FNswap(A$,"Smale's Gallery Mast Yard","Smales' Gallery, Mast Yard")
 2190 A$=FNswap(A$,"The Crag Argument's Yard","Argument's Yard, The Cragg")
 2200 A$=FNswap(A$,"7-8 Falcon Private Hotel Esplanade","Falcon Private Hotel, 7-8 Esplanade")
 2210 A$=FNswap(A$,"The Cra's Pier Road","The Cragg")
 2220 A$=FNswap(A$,"The Cra's ","")
 2230 A$=FNswap(A$,"The Cras ","")
 2240 A$=FNswap(A$,"Cleveda","Clevedon")
 2250 A$=FNswap(A$,"The Crag Carter","Carter")
 2260 A$=FNswap(A$,"Streon Shalp","Streonshalh")
 2270 A$=FNswap(A$,"Streonshalk","Streonshalh")
 2280 A$=FNswap(A$,"Pass Haggersgate","Pass")
 2290 A$=FNswap(A$," Kyber",", Khyber")
 2300 A$=FNswap(A$,"Amusement's","Amusements,")
 2310 A$=FNswap(A$,"View Helredale","View, Helredale")
 2320 A$=FNswap(A$,"Cottage's","Cottages")
 2330 A$=FNswap(A$,"Peters ","Peter's ")
 2340 A$=FNswap(A$,"Abbots ","Abbot's ")
 2350 A$=FNswap(A$,"Ghaut ","Ghaut, ")
 2360 A$=FNswap(A$,"Roath","Routh")
 2370 A$=FNswap(A$,"Ronth","Routh")
 2380 A$=FNswap(A$,"Tower Flats","Tower Flats,")
 2390 A$=FNswap(A$,"Mill Close","Well Close")
 2400 A$=FNswap(A$,"Stables ","Stables, ")
 2410 A$=FNswap(A$,"Cottage ","Cottage, ")
 2420 A$=FNswap(A$,"Hse","House")
 2430 A$=FNswap(A$,"House ","House, ")
 2440 A$=FNswap(A$,"House, Hotel","House Hotel")
 2450 A$=FNswap(A$,"House, Chief","House Chief")
 2460 A$=FNswap(A$,"Hotel ","Hotel, ")
 2470 A$=FNswap(A$,"Hotel, Yard","Hotel Yard")
 2480 A$=FNswap(A$,"Hotel, Flats","Hotel Flats")
 2490 A$=FNswap(A$,"Lodge ","Lodge, ")
 2500 A$=FNswap(A$,"Lodge, Farm ","Lodge Farm, ")
 2510 A$=FNswap(A$,"Isolation Hospital ","Isolation Hospital, ")
 2520 A$=FNswap(A$,"Hoverdead ","Homestead, ")
 2530 A$=FNswap(A$,"Bungalow ","Bungalow, ")
 2540 A$=FNswap(A$,"Retreat ","Retreat, ")
 2550 A$=FNswap(A$," Larpool",", Larpool")
 2560 A$=FNswap(A$,"Whitehall Glen Holme","Glen Holme")
 2570 A$=FNswap(A$," Whitehall",", Whitehall")
 2580 A$=FNswap(A$,"Glenholme","Glen Holme")
 2590 A$=FNswap(A$,"Lenskill","Linskill")
 2600 A$=FNswap(A$,"Flowersafe","Flowergate")
 2610 A$=FNswap(A$,"Flowergate Brunswick Street","Flowergate")
 2620 A$=FNswap(A$,"Terrace St Hildas Terrace","Terrace")
 2630 A$=FNswap(A$,"Terrace St Hildas Terr","Terrace")
 2640 A$=FNswap(A$,"Terrace Flowergate","Terrace")
 2650 A$=FNswap(A$," Rd"," Road")
 2660 A$=FNswap(A$," Yd"," Yard")
 2670 A$=FNswap(A$," Yard "," Yard, ")
 2680 A$=FNswap(A$,"Saint ","St. ")
 2690 A$=FNswap(A$,"Inn St. ","Inn, St. ")
 2700 A$=FNswap(A$,"Staithe","Staith")
 2710 A$=FNswap(A$,"Anna Street","Ann's Staith")
 2720 A$=FNswap(A$,"St Ann ","St. Ann's ")
 2730 A$=FNswap(A$,"St Anns ","St. Ann's ")
 2740 A$=FNswap(A$,"St Ann's ","St. Ann's ")
 2750 A$=FNswap(A$,"St Peter","St. Peter")
 2760 A$=FNswap(A$,"St Hilda","St. Hilda")
 2770 A$=FNswap(A$,"St Catharines","St. Catharine's,")
 2780 A$=FNswap(A$,"Muneastere","Muncaster's")
 2790 A$=FNswap(A$,"Boulton's","Bolton's")
 2800 A$=FNswap(A$,"Mc Lacken","McLacklin")
 2810 A$=FNswap(A$,"Square ","Square, ")
 2820 A$=FNswap(A$,"Mount Cliff","Mount, Cliff")
 2830 A$=FNswap(A$,"The Paddock The Paddock","The Paddock")
 2840 A$=FNswap(A$,"Belle Vue Terrace Belle Vue Terrace","Belle Vue Terrace")
 2850 A$=FNswap(A$,"Westcliff","West Cliff")
 2860 :
 2870 A$=FNswapchk(A$,"Crag","Cragg")
 2880 A$=FNswapchk(A$,"Ave","Avenue")
 2890 A$=FNswapchk(A$,"Terr","Terrace")
 2900 A$=FNswapchk(A$,"Arms Yard","Whitby Arms Yard")
 2910 A$=FNswap(A$,"Blacksmith's Whitby","Blacksmith's")
 2920 :
 2930 A%=INSTR(A$,"West Cliff"):IF A%:IFMID$(A$,A%-1,1)>"@":A$=FNswap(A$," West Cliff",", West Cliff")
 2940 A%=INSTR(A$,"Aelfleda"):IF A%:IFINSTR(A$,",")=0:A%=INSTR(A$+" "," ",15):A$=LEFT$(A$,A%)+", Primitive Methodist Chapel Yard"
 2950 A$=FNswap(A$,"''","'")
 2960 A$=FNswap(A$,",,",",")
 2970 A$=FNswap(A$,"ggg","gg")
 2980 REM A$=FNswap(A$,"""","'")
 2990 IF LEFT$(A$,11)="New Gardens":A$=FNswap(A$,",",""):A%=INSTR(A$," ",5):IFA%:A$=MID$(A$,A%+1)+", "+LEFT$(A$,A%-1)
 3000 A%=INSTR(A$,"Floor "):IF A%:B%=INSTR(A$," "):A$=MID$(A$,B%+1,A%-B%+4)+", "+LEFT$(A$,B%)+MID$(A$,A%+6)
 3010 IF A$="Kirbys Hotel":A$="Kirby's Hotel, East Terrace"
 3020 IF A$="Royal Hotel":A$="Royal Hotel, East Terrace"
 3030 :
 3040 REM Canonicalise address
 3050 RESTORE +0
 3060 READ street$
 3070 REPEAT
 3080   READ yard$
 3090   REPEAT
 3100     A$=FNadd(A$,yard$,street$)
 3110     READ yard$
 3120   UNTIL yard$="*"
 3130   READ street$
 3140 UNTIL street$="*"
 3150 DATA "Tate Hill","Sandside",*
 3160 DATA "Grape Lane","Tin",*
 3170 DATA "Brewster Lane","Brewster's Cottages",*
 3180 DATA "Church Lane","East Abbey Terrace",*
 3190 DATA "Low Well Yard","Denmark Place",*
 3200 DATA "High Well Yard","Ainsley's Court",*
 3210 DATA "The Ropery","Boulby Bank Top",*
 3220 DATA "East Cliff","Coastguard",*
 3230 DATA "Laverick Steps","Pear Tree House",*
 3240 DATA "Salt Pan Well Yard","White Cottages",*
 3250 DATA "Hawsker Lane","Stoupe",*
 3260 DATA "Spital Bridge","Olive",*
 3270 DATA "Brunswick Street","Morrison's",*
 3280 DATA "Khyber Pass","Streonshalh",*
 3290 DATA "McLachlin's Yard, Cliff Street","Bolton's Buildings",*
 3300 REM DATA "Green Lane","Folly Gardens",*
 3310 REM DATA "Golden Lion Bank","Golden Lion Inn",*
 3320 REM DATA "Downdinner Hill","Hanover Terrace",*
 3330 REM DATA "Waterstead Lane","Boghole",*
 3340 :
 3350 DATA "Church Street"
 3360 DATA "Blackburn's","Wilson's","Woodwark's","Kiln","Borough","New Way","Benson's"
 3370 DATA "Horse","Forester's","Clark's","Green's","Tate's","Stanley Place"
 3380 DATA "Blacksmith's Arms","Well Yard","Turner's","Morley's","Bank's","Hamilton's"
 3390 DATA "Smales'","Bolton's Yard","Primitive","Frank's","Brown's","Elbow","Taylerson's"
 3400 DATA "Brewster","Craven's","School Yard","Hospital Y","Marsden's","Stanley Yard"
 3410 DATA "Flintoft's","Cockpit","Ellerby","Nettleship","Corner's","Boauson's"
 3420 DATA "Sayer's","Steps","Prospect Place","Hall's Yard","Ivy Yard","Brewery Yard"
 3430 DATA "Studley","Horner's","Gaskin's","Blacksmith Arms","Hospital Yard","Mast Yard"
 3440 DATA *
 3450 DATA "Flowergate"
 3460 DATA "Hall's Place","Rose & Crown","Haydock's","Waterloo","Staffordshire"
 3470 REM DATA "McLachlin's","Marwood's","Fawcett's","Easterby"
 3480 REM DATA "Old Abbey Inn","Gardiner's"
 3490 DATA *
 3500 DATA "Baxtergate"
 3510 DATA "Elm","Ripley's","Breckon's","Leng's","Vipond's","Ward's","Tyreman's"
 3520 DATA "Loggerhead","Linskill","Beck"
 3530 DATA *
 3540 DATA "Haggersgate"
 3550 DATA "Paradise","Whitby Arms","Bakehouse","Elephant"
 3560 REM "Muncaster's"
 3570 DATA *
 3580 DATA "The Cragg"
 3590 DATA "Mission Hall","Clevedon","Barry's","Carter's","Cliff Steps"
 3600 DATA *
 3610 DATA "Cliff Street"
 3620 DATA "Andrew's","The Mount","Bolton's Buildings"
 3630 DATA *
 3640 REM DATA "Sandgate"
 3650 REM DATA "Nicholson's","Queen Hotel"
 3660 REM DATA *
 3670 REM DATA "Grape Lane"
 3680 REM DATA "Tin","Lamb's","Raffled Anchor","Custom House Hotel"
 3690 REM DATA *
 3700 REM DATA "St. Ann's Staith"
 3710 REM DATA "Wear's","Buck ","Old Post Office","St Ann's Lane"
 3720 REM DATA *
 3730 REM DATA "Skinner Street"
 3740 REM DATA "Sandal","Harrison's","Ivy Place","Botham's","Abbey View"
 3750 REM DATA *
 3760 REM DATA "Bagdale"
 3770 REM DATA "Broomfield Terrace","Carr's"
 3780 REM DATA *
 3790 DATA "Green Lane"
 3800 DATA "New Gardens","Folly Gardens"
 3810 DATA *
 3820 DATA "Spital Bridge"
 3830 DATA "Whitehall","Raft"
 3840 DATA *,*
 3850 :
 3860 REM Addresses with multiple locations
 3870 READ check$
 3880 REPEAT
 3890   READ yard$,street$
 3900   IF INSTR(A$,check$)=0:A$=FNadd(A$,yard$,street$)
 3910   READ check$
 3920 UNTIL check$="*"
 3930 REM  if not this street, yard, set to this street
 3940 DATA The Ropery,Boulby Bank,Church Street
 3950 DATA Sandgate,Johnson's,Baxtergate
 3960 DATA Cragg,Argument's,Church Street
 3970 DATA Church Street,Argument's,The Cragg
 3980 DATA Cliff Street,Miller's,Haggersgate
 3990 DATA Haggersgate,Miller's,Cliff Street
 4000 DATA Cliff Street,Muncaster's,Haggersgate
 4010 DATA Haggersgate,Muncaster's,Cliff Street
 4020 REM DATA Church Street,Ship Inn,Haggersgate
 4030 REM DATA Church Street,Bakehouse,Haggersgate
 4040 REM DATA Church Street,Brown's,Haggersgate
 4050 REM DATA Church Street,Dark Entry,Baxtergate
 4060 REM DATA Church Street,Lockey's,Grape Lane
 4070 REM DATA Brunswick Street,Benson's,Church Street
 4080 REM DATA Well Close,Well,Church Street
 4090 REM DATA East Cliff,St. Hilda's Cottages,Church Street
 4100 REM DATA Farm,Mount Pleasant,"Elbow Yard, Church Street"
 4110 REM DATA Hawsker,Blacksmith's,Church Street
 4120 REM DATA Cliff Street,Waite's,Church Street
 4130 DATA *
 4140 REM IFINSTR(A$,"Stainsacre")=0:IFINSTR(A$,"Cottage")=0:IFINSTR(A$,"Larpool")=0:A$=FNadd(A$,"Mount","Cliff Street")
 4150 :
 4160 info$(7)=A$
 4170 :
 4180 REM info$(16)=file$:REM Testing
 4190 IF verbose% THEN
 4200   FOR A%=0 TO max%
 4210     A$=LEFT$(info$(A%),56):PRINTTAB(36,A%+2);A$;:IF len%(A%)>LENA$:PRINTSPC(len%(A%)-LENA$);
 4220     len%(A%)=LENA$
 4230   NEXT A%
 4240 ENDIF
 4250 PROCcsv_wr(out%,info$())
 4260 ENDPROC
 4270 :
 4280 DEFFNadd(addr$,yard$,street$)
 4290 IF INSTR(addr$,yard$+" "):IF INSTR(addr$,street$)=0:=addr$+", "+street$
 4300 IF RIGHT$(addr$,LENyard$)=yard$:IF INSTR(addr$,street$)=0:=addr$+", "+street$
 4310 =addr$
 4320 :
 4330 DEFFNswap(in$,match$,swap$)
 4340 A%=INSTR(in$,match$):IF A%:in$=LEFT$(in$,A%-1)+swap$+MID$(in$,A%+LENmatch$)
 4350 =in$
 4360 :
 4370 DEFFNswapchk(in$,match$,swap$)
 4380 A%=INSTR(in$,match$):IF A%:IF INSTR(in$,swap$)=0:in$=LEFT$(in$,A%-1)+swap$+MID$(in$,A%+LENmatch$)
 4390 =in$
 4400 :
 4410 DEFFNnoquote(A$):IFASCA$<>34:=A$
 4420 =MID$(A$,2,INSTR(A$,"""",2)-2)
 4430 :
 4440 DEFFNnohtml(A$):REPEAT:A%=INSTR(A$,"<"):IF A%:A$=LEFT$(A$,A%-1)+MID$(A$,INSTR(A$,">")+1)
 4450   UNTILA%=0:REPEAT:A%=INSTR(A$,"&",A%+1)
 4460   IFMID$(A$,A%,6)=""":A$=LEFT$(A$,A%-1)+"'"+MID$(A$,A%+6)
 4470   IFMID$(A$,A%,5)="'" :A$=LEFT$(A$,A%-1)+"'"+MID$(A$,A%+5)
 4480   IFMID$(A$,A%,5)=""""    :A$=LEFT$(A$,A%-1)+"'"+MID$(A$,A%+5)
 4490 UNTILA%=0:=A$
 4500 :
 4510 DEFPROCClose_All
 4520 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
 4530 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
 4540 ENDPROC
 4550 :
 4560 DEFPROCcsv_rd(i%,array$())
 4570 LOCAL n%:n%=0:array$()="":A$=GET$#i%:IFA$="":A$=GET$#i%
 4580 A$=A$+","
 4590 REPEAT
 4600   IF LEFT$(A$,2)="=""":A$=MID$(A$,2)
 4610   IF LEFT$(A$,1)="""" THEN
 4620     A%=INSTR(A$,""",",2)+1:array$(n%)=MID$(A$,2,A%-3)
 4630   ELSE
 4640     A%=INSTR(A$,","):array$(n%)=LEFT$(A$,A%-1)
 4650   ENDIF
 4660   A$=MID$(A$,A%+1):n%=n%+1
 4670 UNTILA$=""
 4680 ENDPROC
 4690 :
 4700 DEFPROCcsv_wr(o%,array$())
 4710 LOCAL n%,q%:n%=DIM(array$(),1)
 4720 FOR A%=0 TO n%:A$=array$(A%)
 4730   q%=INSTR(A$,",")
 4740   IF q%=0:q%=(ASCA$=48)AND(INSTR(A$,"/")=0)     :REM leading zeros 00001
 4750   IF q%=0:IFVALLEFT$(A$,1):q%=INSTR(A$,"E")     :REM preserve 1234E5678
 4760   IF q%=0:q%=LENSTR$VALA$>8                     :REM long numbers 12345678901234
 4770   IF q%=0:IFVALA$:q%=INSTR(A$,"/")AND(ASCA$<>48):REM fractions 12/34
 4780   IF q%=0:q%=LEFT$(A$,1)="-"                    :REM leading hyphen -
 4790   IF q%=0:q%=MID$(A$,3,1)=" "ANDMID$(A$,7,1)=" ":REM dates xx XXX xxxx
 4800   IF q%:A$=""""+A$+"""":IFINSTR(A$,",")=0:A$="="+A$
 4810   BPUT#o%,A$;:IF A%<>n%:BPUT#o%,",";
 4820 NEXT A%:BPUT#o%,""
 4830 ENDPROC
 4840 :
 4850 DEFFNrd(i%):A$=GET$#i%:IFA$="":A$=GET$#i%
 4860 =A$
 4870 :
 4880 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
 4890 DEFFNuc(A$):IFA$="":=""
 4900 FOR A%=1 TO LEN A$:IFMID$(A$,A%,1)>"_":A$=LEFT$(A$,A%-1)+CHR$(ASCMID$(A$,A%,1)AND&DF)+MID$(A$,A%+1)
 4910 NEXT:=A$
 4920 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
 4930 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
 4940 =A$