10 REM > RollToCSV
   20 REM Convert text notes of Electoral Register into standard census format
   30 :
   40 verbose%=TRUE
   50 max%=21:reg%=1950:year%=1951
   60 :
   70 A%=0:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
   80 s$=".":fmax%=255:IFos%AND32:d$="\" ELSE IFos%AND8:d$="/" ELSE s$="/":d$=".":fmax%=10
   90 A$="":in%=OPENIN("!Make"):IF in%=0:in%=OPENIN("!Make"+s$):IF in%=0:in%=OPENIN("!Make"+s$+"bat")
  100 IF in%:REPEAT:A$=GET$#in%:UNTIL EOF#in% OR INSTR(A$,"rem"OR INSTR(A$,"REM"):CLOSE#in%:in%=0
  110 A%=INSTR(A$,"reg=") :IF A%:reg% =VALMID$(A$,A%+4)
  120 A%=INSTR(A$,"year="):IF A%:year%=VALMID$(A$,A%+5)
  130 A%=INSTR(A$,"max=") :IF A%:max% =VALMID$(A$,A%+4)
  140 DIM head$(max%),info$(max%),addr$(max%)
  150 FOR A%=0 TO max%:READ head$(A%):NEXT
  160 DATA "HOUSEHOLD NUMBER","SURNAME","NAME","AGE","RELATIONSHIP","SEX","MARITAL STATUS","STREET ADDRESS"
  170 DATA "OCCUPATION","BIRTH YEAR","BIRTH PLACE","BIRTH COUNTY","BIRTH COUNTRY","INDIVIDUAL NUMBER"
  180 DATA "CIVIL PARISH","SUB-REGISTRATION DISTRICT","ENUMERATION DISTRICT","PIECE","PAGE","FOLIO"
  190 DATA "POSTCODE","WALK ORDER"
  200 :
  210 ON ERROR PRINT:REPORT:PROCClose_All:PRINT" at line ";ERL:IF ERR=17:QUIT ELSE ON:END
  220 OFF:age$="":laststreet$=""
  230 out%=OPENOUT(LEFT$("Whitby"+STR$year%+s$+"csv",fmax%))
  240 IF out%=0:PRINT"Couldn't open output file, is it already open?":CLOSE#in%:in%=0:END
  250 PROCcsv_wr(out%,head$())
  260 IF verbose%:CLS:PRINT':FOR A%=0 TO max%:PRINTFNd0(A%,2);": ";head$(A%);":":NEXT
  270 :
  280 lookup$="Addrs"+s$+"csv"
  290 lookup%=OPENIN(lookup$):IF lookup%:PROCcsv_rd(lookup%,addr$())
  300 :
  310 FOR pd%=ASC"a" TO ASC"}":pd$=CHR$pd%+CHR$pd%
  320   IF pd%=ASC"{":pd$="aa"
  330   IF pd%=ASC"|":pd$="ab"
  340   IF pd%=ASC"}":pd$="ac"
  350   parish$    ="Whitby"
  360   name$      =""
  370   surname$   =""
  380   poll$      =""
  390   lastpoll$  =""
  400   this$      =""
  410   last$      =""
  420   street$    =""
  430   house$     =""
  440   in%=OPENIN("Whitby"+STR$reg%+pd$+".txt"):IF in%:PROCfile:CLOSE#in%:in%=0
  450 NEXT pd%
  460 CLOSE#out%:out%=0
  470 QUIT
  480 :
  490 DEFPROCfile
  500 pd$=FNuc(pd$)
  510 REPEAT
  520   A$=GET$#in%:IFA$="":IFPTR#in%>1:PTR#in%=PTR#in%-2:IFBGET#in%<>BGET#in%:A$=GET$#in%
  530   IF LEFT$(A$,1)<>"#":last$=this$:this$=A$:PROCline:PROCentry
  540 UNTILEOF#in%
  550 ENDPROC
  560 :
  570 DEFPROCline
  580 A%=INSTR(A$,"!"):IF A%:A$=FNs(LEFT$(A$,A%-1)):REM Strip !comment
  590 A%=INSTR(A$,"+"):IF A%:A$=LEFT$(A$,A%-1)+MID$(A$,A%+1):REM Append original+added_amendment
  600 name$=""
  610 IF RIGHT$(A$,1)="""":A$=LEFT$(A$,LENA$-1)+LEFT$("#",VALhouse$=0)+house$
  620 A%=INSTR(A$,"#"):IF A%:IF MID$(A$,A%+1,1)<>" ":A$=LEFT$(A$,A%)+" "+MID$(A$,A%+1)
  630 A%=0:REPEAT:A%=A%+1
  640   IF MID$(A$,A%,1)>"@":A$=LEFT$(A$,A%-1)+FNuc(MID$(A$,A%,1))+MID$(A$,A%+1)
  650   A%=INSTR(A$+" "," ",A%)
  660 UNTIL A%>=LEN A$
  670 IFverbose%:PRINTTAB(0,0);A$;:IF LEN A$<70:PRINTSPC(70-LENA$);
  680 IF LEFT$(A$,6)="Const:" :const$ =MID$(A$,INSTR(A$," ")+1):ENDPROC
  690 REM IF LEFT$(A$,3)="Pd:"    :pd$    =FNuc(RIGHT$(A$,2)):ENDPROC
  700 IF LEFT$(A$,5)="Ward:"  :ward$  =MID$(A$,INSTR(A$," ")+1):ENDPROC
  710 IF LEFT$(A$,7)="Parish:":A$=MID$(A$,INSTR(A$," ")+1):parish$=LEFT$(A$,INSTR(A$+" "," ")-1):ENDPROC
  720 IF INSTR(A$,":"):ENDPROC
  730 IF last$="":IF A$<>"":street$=A$:house$="":ENDPROC
  740 IF A$="":ENDPROC
  750 :
  760 age$       =""
  770 relation$  =""
  780 sex$       =""
  790 condition$ =""
  800 address$   =""
  810 occupation$=""
  820 birthyear$ =""
  830 birthplace$=""
  840 postcode$  =""
  850 walk$      =""
  860 IF VALA$:A%=INSTR(A$," "):poll$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1) ELSE poll$=STR$(VALpoll$+1)
  870 IF poll$<>"1":IF VALpoll$<>VALlastpoll$+1:PROCmissing
  880 IF MID$(A$,2,1)=" ":IF LEFT$(A$,1)=LEFT$(surname$,1):A$=surname$+MID$(A$,2)
  890 A%=INSTR(A$,"#"):IF A%=0:REPEATA%=A%+1:UNTILVALMID$(A$,A%) OR A%=LEN A$
  900 IF A%<>LEN A$:house$=FNs(MID$(A$,A%+1)):A$=FNs(LEFT$(A$,A%-1)):IFVALhouse$:IF INSTR(house$," ")=0:house$=FNuc(house$)
  910 A%=INSTR(A$," "):surname$=LEFT$(A$,A%-1):name$=MID$(A$,A%+1)
  920 surname$=FNswap(surname$,"_"," "):name$=FNswap(name$,"_"," ")
  930 A%=LENhouse$:REPEAT:A%=A%-1:UNTILMID$(house$,A%,1)=" " OR A%<1
  940 address$=FNs(house$+LEFT$(",",VALMID$(house$,A%+1)=0 AND house$<>"")+" "+street$)
  950 IF LEFT$(address$,4)="(no)":address$=FNs(MID$(address$,6))
  960 IF LEFT$(address$,5)="Nonum":address$=FNs(MID$(address$,7))
  970 :
  980 REM Create a Sex field
  990 REM Difficult to assign a sex if nothing to match
 1000 REM Will have to try and match personal names
 1010 sex$=""
 1020 A$=name$:IF MID$(A$,2,1)=" ":A$=MID$(A$,3):REM Look at personal name
 1030 IF LEFT$(A$,1)="(":A%=INSTR(A$,")"):IF A%:A$=FNs(MID$(A$,A%+1))
 1040 RESTORE +0
 1050 READ s$
 1060 REPEAT
 1070   READ n$
 1080   REPEAT
 1090     A%=INSTR(A$,"-"):IF A%=0:A%=INSTR(A$+" "," ")
 1100     IF A$=n$ OR LEFT$(A$,A%-1)=n$ OR MID$(A$,A%+1)=n$:sex$=s$
 1110     READ n$
 1120   UNTILn$="*" OR sex$<>""
 1130   READ s$
 1140 UNTILs$="*" OR sex$<>""
 1150 IF sex$="F":sex$="Female"
 1160 IF sex$="M":sex$="Male"
 1170 :
 1180 DATA M
 1190 DATA John,David,Michael,Paul,Peter,Andrew,James,Richard,Robert,Stephen,Christopher,William,Ian,Mark,Alan
 1200 DATA Anthony,Thomas,Brian,George,Simon,Colin,Steven,Daniel,Kenneth,Neil,Philip,Joseph,Jonathan,Kevin
 1210 DATA Matthew,Raymond,Martin,Stuart,Barry,Ronald,Derek,Charles,Keith,Edward,Lee,Graham,Eric,Gary,Geoffrey
 1220 DATA Trevor,Leslie,Jason,Roger,Adam,Darren,Timothy,Terence,Malcolm,Dennis,Benjamin,Arthur,Donald,Samuel
 1230 DATA Nicholas,Craig,Carl,Adrian,Harold,Wayne,Nigel,Gordon,Luke,Jamie,Ryan,Frederick,Shaun,Norman,Francis
 1240 DATA Duncan,Ernest,Scott,Stanley,Marc,Patrick,Rodney,Sean,Harry,Henry,Frank,Nathan,Alexander,Jack,Douglas
 1250 DATA Stewart,Bernard,Jeffrey,Howard,Edwin,Allan,Garry,Albert,Gareth,Russell,Lawrence,Liam,Dean,Martyn
 1260 DATA Graeme,Ralph,Jeremy,Vincent,Karl,Joshua,Clifford,Justin,Shane,Tom,Sam,Victor,Cyril,Bryan,Oliver,Hugh
 1270 DATA Ben,Aaron,Fred,Jordan,Terry,Barrie,Ricky,Christian,Phillip,Gerald,Carly,Alfred,Denis,Leonard,Desmond
 1280 DATA Cedric,Reginald,Clive,Sidney,Laurence,Grant,Arron,Lewis,Gregory,Glen,Callum,Danny,Owen,Wilfred,Alex
 1290 DATA Louis,Marcus,Miles,Vivien,Gavin,Kieran,Jon,Damien,Ivan,Dale,Declan,Melvyn,Dominic,Warren,Walter
 1300 DATA Jeffery,Julian,Mervyn,Noel,Ashley,Damian,Ross,Antony,Alec,Micheal,Iain,Herbert,Ivor,Vernon,Joel
 1310 DATA Bruce,Maurice,Godfrey,Kenny,Angus,Gilbert,Neale,Neville,Alastair,Archibald,Mathew,Edgar,Mitchell
 1320 DATA Gerard,Jo,Tony,Calum,Arnold,Errol,Alistair,Glenn,Derrick,Lloyd,Damon,Allen,Kelvin,Steve,Aidan,Dalton
 1330 DATA Darran,Lionel,Nick,Fredrick,Alain,Glynn,Horace,Mike,Clarence,Abbi,Pete,Lancelot,Harvey,Stephan,Sammy
 1340 DATA Freddie,Mohamed,Allister,Daren,Percy,Jacob,Jimmy,Cornelius,Xavier,Justine,Derick,Greg,Darron,Nicolas
 1350 DATA Alfie,Marvin,Christofer,Terrence,Carlos,Bill,Dave,Andre,Winston,Emma,Edmund,Erwin,Austin,Derren,Amos
 1360 DATA Clint,Billy,Kieron,Loos
 1370 DATA Abdul,Brent,Byron,Calvin,Cecil,Connor,Duane,Geoff,Gerrald,Issac,Joe,Kirk,Lester,Rob,Robin,Roy,Rueben
 1380 DATA Saul,Simeon,Toby,Tristan,Tyrone,Barrington,Chad,Ethan,Frankland,Frazer,Garfield,Gerry,Giles,Huw
 1390 DATA Kristoffer,Morris,Rex,Rory,Stefan,Tobias,Ritson,Barnaby,Don,Josh,Les,Louie,Max,Richie,Vincente
 1400 DATA Agmondisham,Angelo,Bertie,Bertram,Claude,Cuthbert,Elijah,Enoch,Humphrey,Isaac,Hephziban,Aquila,Bob
 1410 DATA Seth,Moses,Denys,Willie,Jardine,Lennard,Azuban,Arthur,Roland,Hubert,William,Rowland,Edwards,Elliot
 1420 DATA Jim,Hector,Bernard,Bertrand,Oscar,Geoffry,Horatio,Hughe,Cristopher,Charlie
 1430 DATA Ambrose,Archie,Basil,Dudley,Emerson,Franklin,Friend,Heathcliffe,Grenville,Harrison,Ivanhoe,Johnson
 1440 DATA Murray,Roderick,Ronnie,Smith,Wilson,Talfryn,Irwin,Roman,Elliott,Hoyland,Addison,Turton
 1450 DATA *
 1460 :
 1470 DATA F
 1480 DATA Margaret,Susan,Patricia,Mary,Christine,Elizabeth,Jean,Barbara,Linda,Karen,Julie,Sarah,Ann,Jane,Helen,Kathleen
 1490 DATA Maureen,Joan,Jennifer,Nicola,Carol,Joyce,Dorothy,Anne,Judith,Alison,Janet,Joanne,Sheila,Wendy,Rebecca,Emma
 1500 DATA Catherine,Gillian,Jacqueline,Amanda,Valerie,Pauline,Pamela,Lisa,Deborah,Victoria,Elaine,Doreen,Michelle
 1510 DATA Laura,Sandra,Heather,Rachel,Sharon,Ruth,Brenda,Louise,Eileen,Audrey,Lesley,Sylvia,Angela,Samantha,Claire
 1520 DATA Irene,June,Sally,Marjorie,Tracy,Amy,Maria,Shirley,Diane,Donna,Carole,Paula,Hannah,Fiona,Rosemary,Rita
 1530 DATA Natalie,Hazel,Dawn,Kathryn,Beryl,Kerry,Olive,Betty,Denise,Lorraine,Caroline,Gemma,Joanna,Marion,Lynne
 1540 DATA Melanie,Jill,Hilda,Lynda,Leanne,Stephanie,Florence,Sophie,Charlotte,Jessica,Yvonne,Doris,Julia,Josephine
 1550 DATA Jayne,Edith,Lucy,Marie,Cheryl,Katie,Avis,Clare,Mavis,Kelly,Jeanette,Carolyn,Andrea,Winifred,Tracey,Lynn
 1560 DATA Emily,Elsie,Katherine,Sara,Christina,Anna,Frances,Beverley,Zoe,Diana,Janice,Jenny,Teresa,Freda,Nora,Kate
 1570 DATA Lorna,Alice,Annie,Jade,Kirsty,Stacey,Tina,Veronica,Norma,Debra,Gwendoline,Danielle,Agnes,Kim,Hayley,Ida
 1580 DATA Bridget,Phyllis,Joy,Stella,Grace,Rachael,Vera,Iris,Jodie,Tanya,Eleanor,Ellen,Penelope,Marilyn,Alexandra
 1590 DATA Violet,Juliet,Jillian,Jemma,Lindsey,Daphne,Nicole,Katrina,Lily,Gail,Myra,Megan,Ada,Rose,Enid,Lindsay
 1600 DATA Dianne,Gladys,Janine,Mandy,Faye,Evelyn,Esther,Theresa,Thelma,Cynthia,Edna,Aileen,Vanessa,Avril,Annette
 1610 DATA Gwyneth,Marian,Naomi,Nancy,Muriel,Mildred,Allison,Marlene,Olivia,Olga,Kay,Philippa,Lilian,Rosalind
 1620 DATA Georgina,Toni,Lillian,Lauren,Eva,Keeley,Lyndsay,Chloe,Ruby,Rhiannon,Monica,Miriam,Abigail,Michele,Nadine
 1630 DATA Bethany,Sonia,Melissa,Marina,Mollie,Rosie,Jenna,Karina,Anita,Zara,Debbie,Rosemarie,Cathryn,Carla,Jenni
 1640 DATA Rikki,Lydia,Eunice,Moira,Constance,Marianne,Glynis,Cassie,Suzanne,Tiffany,Anthea,Kerrie,Vikki,Greta
 1650 DATA Helena,Priscilla,Kayleigh,Mabel,Roberta,Jennie,Rosalyn,Charlene,Francesca,Gina,Jodi,Nichola,Honor,Rosina
 1660 DATA Vivienne,Judy,Rebekah,Isobel,Geraldine,Beatrice,Sadie,Cordelia,Gloria,Erica,Bessie,Hope,Jasmine,Chantelle
 1670 DATA Flora,Marcia,Rosaleen,Marguerite,Martha,Williamina,Eveline,Kristina,Katharine,Maxine,Elisabeth,Heidi
 1680 DATA Juliette,Nina,Glenys,Jocelyn,Harriet,Deirdre,Maisie,Sybil,Nellie,Selina,Amber,Michaela,Carrie,Jeannette
 1690 DATA Philomena,Laureen,Isabel,Tim,Monika,Belinda,Terri,Florance,Kimberley,Adele,Loraine,Sonja,Ingrid,May,Jackie
 1700 DATA Janette,Gwendolyn,Christy,Una,Eliza,Kaylea,Vicky,Ivy,Alyson,Robyn,Tara,Kara,Rhoda,Kirstie,Celia,Molly
 1710 DATA Madeline,Jaclyn,Holly,Rosalie,Noreen,Colleen,Beth,Jessie,Matilda,Lyn,Coral,Beverly,Jeannie,Myrna,Chelsie
 1720 DATA Serena,Zelda,Jannette,Madeleine,Dionne,Margarette,Roslyn,Marelyn,Cassandra,Lea,Juanita,Haydn,Susannah
 1730 DATA Allyson,Stephania,Kristie,Antonella,Colette,M,Berenice,Donnella,Ursula,G,Hollie,Rosamond,Jolene,Antonia
 1740 DATA Yasmin,Brigette,Morag,Roseanne,Paulette,Rosaline,Kathlyn,Crystal,Cara,Kylee,Ethelinda,Adela,Cathrine
 1750 DATA Sabina,Rhona,Poppy,Teri,Gertrude,Queenie,Corrine,Angelique,Peppa,Roxann,Annabel,Rosamund,Clair,Melody
 1760 DATA Vicki,Helga,Ellie,Magdalena,Dinah,Kaylee,Gabrielle,Alissa,Natasha,Meg,Eve,Amelia,Bryony,Vanda,Katy,Clara
 1770 DATA Siobhan,Jaqualine,Kimberly,Andrena,Nikki,Bette,Roxanne,Suzie,Ethel,Rozanne,Cherry,Sheenagh,Margot,Angie
 1780 DATA Liselotte,Susanna,Bronwen,Aimee,Tessa,Sydney,Chrystal,Rosalee,Vickie,Roseanna,Delia,Johanna,Coreen,Lucille
 1790 DATA Brigid,Katarina,Becky,Julianne,Tracie,Claudia,Maggie,Aleshia,Ella,Suzy,Gwennoth,Suzanna,Ava,Lana,Andreena
 1800 DATA Rebecka,Kathrine,Pollyanna,Cathleen,Nicholla,Bertha,Pamala,Sheelagh,Winafrid,Wilhelmina,Stephenie,Winefride
 1810 DATA Adrienne,Bettie,Camilla,Roslyne,Alisha,Louisa,Virginia,Sylvie,Peggy,Anastasia,Deb,Gwenneth,Winnie,Bessy
 1820 DATA Ashlea,Caitlin,Chelcea,Cherie,Clarissa,Collette,Deirdre,Dianna,Effie,Erika,Fenella,Georgia,Gill,Glenda
 1830 DATA Inmaculada,Monica,Jacinth,Jamielee,Jeana,Madge,Margo,Millicent,Nadia,Niki,Regina,Robina,Ruebina,Serendipity
 1840 DATA Stefenie,Suelene,Suzette,Svetlana,Trudy,Pearl,Ana,Berverlie,Birgitta,Catriona,Claudine,Deanna,Deidre,Dolores
 1850 DATA Dora,Elfrieda,Estelle,Gaynor,Isla,Katryna,Linsay,Linzi,Linzie,Lola,Lora,Lynzee,Marylyn,Tammy,Tamsin,Trudi
 1860 DATA Auriel,Auriol,Beverlie,Dilys,Lizzie,Lois,Marrissa,Paige,Tyra,Xylia
 1870 DATA Adelaide,Alma,Amily,Angelina,Betsy,Cecily,Christiana,Cissie,Clarice,Clarinda,Connie,Dorice,Dorothea,Elfreda
 1880 DATA Faith,Fannie,Fanny,Florrie,Ina,Isabell,Isabella,Lillie,Lilly,Mathilda,Maud,Minnie,Mona,Norah,Pattie,Phoebe
 1890 DATA Sophia,Tace,Thora,Winifred,Nena,Hephzibah,Zipporah,Blanche,Christania,Emmeline,Hettie,Bella,Alexandria
 1900 DATA Susanne,Agatha,Illian,Hetty,Jannie,Iveagh,Annis,Isabelle,Eveagh,Kitty,Maude,Cecilia,Susie,Jeanne,Nancie
 1910 DATA Henrietta,Lottie,Rosanna,Rosetta,Polly,Lena,Daisy,Lavinia,Esme,Esmee
 1920 DATA Adelina,Adelle,Averil,Bernadette,Clementine,Corinne,Donaldina,Eeanor,Ena,Eugenie,Evera,Flory,Glynnis,Gwen
 1930 DATA Swynne,Honora,Lilias,Lorena,Maralyn,Margery,Marguerete,Marjory,Maura,Meggie,Phillis,Robertina,Rosa
 1940 DATA Shelagh,Therese,Velma,Vivenne,Wilhemina,Cicely,Gwynne,Eily
 1950 DATA *
 1960 DATA *
 1970 :
 1980 REM Ensure correct apostophication
 1990 A$=address$
 2000 RESTORE +0
 2010 READ B$:REPEAT
 2020   A$=FNswap(A$,"s "+B$,"'s "+B$)
 2030   READ B$
 2040 UNTILB$="*"
 2050 DATA B,C,G,L,S,T,Y,*
 2060 A$=FNswap(A$,"Cros's","Cross")
 2070 A$=FNswap(A$,"''","'")
 2080 A$=FNswap(A$,",,",",")
 2090 A$=FNswap(A$,"''","'")
 2100 A$=FNswap(A$,"Arm's","Arms")
 2110 A$=FNswap(A$,"Say's","Says")
 2120 A$=FNswap(A$,"Link's","Links")
 2130 A$=FNswap(A$,"Bobbie's","Bobbies")
 2140 address$=A$
 2150 :
 2160 REM Look for walk order
 2170 walk$=FNlookup(13,pd$+":"+poll$,20)
 2180 :
 2190 ENDPROC
 2200 :
 2210 DEFPROCmissing:LOCAL A$,P%:info$()=""
 2220 FOR P%=VALlastpoll$+1 TO VALpoll$-1:info$(13)=pd$+":"+STR$P%:PROCcsv_wr(out%,info$()):NEXT P%
 2230 ENDPROC
 2240 :
 2250 DEFPROCentry
 2260 IF name$="":ENDPROC
 2270 REM Arrange in output array
 2280 info$()=""
 2290 info$(0) =""                        :REM HOUSEHOLD NUMBER
 2300 info$(1) =surname$                  :REM SURNAME
 2310 info$(2) =name$                     :REM NAME
 2320 info$(3) =""                        :REM AGE
 2330 info$(4) =""                        :REM RELATIONSHIP
 2340 info$(5) =sex$                      :REM GENDER
 2350 info$(6) =""                        :REM MARITAL STATUS
 2360 info$(7) =address$                  :REM STREET ADDRESS
 2370 IFmax%>07:info$(8) =""              :REM OCCUPATION
 2380 IFmax%>08:info$(9) =""              :REM BIRTH YEAR
 2390 IFmax%>09:info$(10)=""              :REM BIRTH PLACE
 2400 IFmax%>10:info$(11)=""              :REM BIRTH COUNTY
 2410 IFmax%>11:info$(12)=""              :REM BIRTH COUNTRY
 2420 IFmax%>12:info$(13)=pd$+":"+poll$   :REM INDIVIDUAL NUMBER
 2430 IFmax%>13:info$(14)=parish$         :REM CIVIL PARISH
 2440 IFmax%>14:info$(15)="Whitby"        :REM SUB-REGISTRATION DISTRICT
 2450 IFmax%>15:info$(16)=""              :REM ENUMERATION DISTRICT, INSTITUTION, OR VESSEL
 2460 IFmax%>16:info$(17)=""              :REM PIECE
 2470 IFmax%>17:info$(18)=""              :REM PAGE
 2480 IFmax%>18:info$(19)=""              :REM FOLIO
 2490 IFmax%>19:info$(20)=""              :REM POSTCODE
 2500 IFmax%>20:info$(21)=walk$           :REM WALK ORDER
 2510 :
 2520 lastpoll$=poll$
 2530 IF verbose%:FOR A%=0 TO max%:PRINTTAB(36,A%+2);LEFT$(info$(A%),56);SPC(56-LENLEFT$(info$(A%),56));:NEXT
 2540 PROCcsv_wr(out%,info$())
 2550 ENDPROC
 2560 :
 2570 DEFFNadd(addr$,yard$,street$)
 2580 IF INSTR(addr$,yard$+" "):IF INSTR(addr$,street$)=0:=addr$+", "+street$
 2590 IF RIGHT$(addr$,LENyard$)=yard$:IF INSTR(addr$,street$)=0:=addr$+", "+street$
 2600 =addr$
 2610 :
 2620 DEFFNswap(in$,match$,swap$)
 2630 A%=INSTR(in$,match$):IF A%:in$=LEFT$(in$,A%-1)+swap$+MID$(in$,A%+LENmatch$)
 2640 =in$
 2650 :
 2660 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
 2670 DEFFNuc(A$):LOCAL B$:IFA$="":=""
 2680 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
 2690 DEFFNlc(A$):LOCAL B$:IFA$="":=""
 2700 REPEATB$=B$+CHR$(ASCA$OR((A$<"_")AND&20)):A$=MID$(A$,2):UNTILA$="":=B$
 2710 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
 2720 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
 2730 =A$
 2740 :
 2750 DEFPROCClose_All
 2760 lookup%=lookup%:IFlookup%:A%=lookup%:lookup%=0:CLOSE#A%
 2770 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
 2780 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
 2790 ENDPROC
 2800 :
 2810 DEFFNlookup(M%,M$,R%)
 2820 REM match field, match data, returned field
 2830 IF lookup%=0:=""
 2840 looklast%=PTR#lookup%
 2850 REPEAT
 2860   IF EOF#lookup%:PTR#lookup%=0:PROCcsv_rd(lookup%,addr$())
 2870   PROCcsv_rd(lookup%,addr$()):match%=(addr$(M%)=M$)
 2880 UNTIL match% OR PTR#lookup%=looklast%
 2890 IF match%:=addr$(R%)
 2900 REM PTR#lookup%=looklast%
 2910 =""
 2920 :
 2930 DEFPROCcsv_rd(i%,array$())
 2940 LOCAL n%:n%=0:array$()="":A$=GET$#i%:IFA$="":A$=GET$#i%
 2950 A$=A$+","
 2960 REPEAT
 2970   IF LEFT$(A$,2)="=""":A$=MID$(A$,2)
 2980   IF LEFT$(A$,1)="""" THEN
 2990     A%=INSTR(A$,""",",2)+1:array$(n%)=MID$(A$,2,A%-3)
 3000   ELSE
 3010     A%=INSTR(A$,","):array$(n%)=LEFT$(A$,A%-1)
 3020   ENDIF
 3030   A$=MID$(A$,A%+1):n%=n%+1
 3040 UNTILA$=""
 3050 ENDPROC
 3060 :
 3070 DEFPROCcsv_wr(o%,array$())
 3080 LOCAL n%,q%:n%=DIM(array$(),1)
 3090 FOR A%=0 TO n%:A$=array$(A%)
 3100   q%=INSTR(A$,",")
 3110   IF q%=0:q%=(ASCA$=48)AND(INSTR(A$,"/")=0)     :REM leading zeros 00001
 3120   IF q%=0:IFVALLEFT$(A$,1):q%=INSTR(A$,"E")     :REM preserve 1234E5678
 3130   IF q%=0:q%=LENSTR$VALA$>8                     :REM long numbers 12345678901234
 3140   IF q%=0:IFVALA$:q%=INSTR(A$,"/")AND(ASCA$<>48):REM fractions 12/34
 3150   IF q%=0:q%=LEFT$(A$,1)="-"                    :REM leading hyphen -
 3160   IF q%=0:q%=MID$(A$,3,1)=" "ANDMID$(A$,7,1)=" ":REM dates xx XXX xxxx
 3170   IF q%:A$=""""+A$+"""":IFINSTR(A$,",")=0:A$="="+A$
 3180   BPUT#o%,A$;:IF A%<>n%:BPUT#o%,",";
 3190 NEXT A%:BPUT#o%,""
 3200 ENDPROC