10 REM > RollToCSV
   20 REM Convert 2011 electoral register into standard census format
   30 REM To do:
   40 REM The Cedars, 19 Carr Gardens, The Carrs should be correctly translated to
   50 REM The Cedars, 19 Carr Gardens, The Carrs instead of
   60 REM 19 The Cedars, Carr Gardens, The Carrs
   70 :
   80 verbose%=TRUE
   90 max%=20:year%=2011
  100 :
  110 A%=0:X%=1:os%=((USR&FFF4)AND&FF00)DIV256
  120 s$=".":fmax%=255:IFos%AND32:d$="\" ELSE IFos%AND8:d$="/" ELSE s$="/":d$=".":fmax%=10
  130 DIM head$(max%),info$(max%),source$(max%)
  140 FOR A%=0 TO max%:READ head$(A%):NEXT
  150 DATA "HOUSEHOLD NUMBER","SURNAME","NAME","AGE","RELATIONSHIP","SEX","MARITAL STATUS","STREET ADDRESS"
  160 DATA "OCCUPATION","BIRTH YEAR","BIRTH PLACE","BIRTH COUNTY","BIRTH COUNTRY","INDIVIDUAL NUMBER"
  170 DATA "CIVIL PARISH","SUB-REGISTRATION DISTRICT","ENUMERATION DISTRICT","PIECE","PAGE","FOLIO","POSTCODE"
  180 :
  190 ON ERROR REPORT:PROCClose_All:PRINT" at line ";ERL:IF ERR=17:QUIT ELSE ON:END
  200 OFF:age$="":laststreet$=""
  210 in%=OPENIN(LEFT$("EARS"+STR$year%+s$+"csv",fmax%))
  220 out%=OPENOUT(LEFT$("Walks"+STR$year%+s$+"csv",fmax%))
  230 IF out%=0:PRINT"Couldn't open output file, is it already open?":END
  240 :
  250 PROCcsv_wr(out%,head$())
  260 IF verbose%:CLS:PRINT':FOR A%=0 TO max%:PRINTFNd0(A%,2);": ";head$(A%);":":NEXT
  270 :
  280 PROCcsv_rd(in%,source$()):REM Skip header
  290 REPEAT
  300   PROCcsv_rd(in%,source$())
  310   IF source$(3)<>"":PROCprocess:PROCcsv_wr(out%,info$())
  320 UNTILEOF#in%
  330 CLOSE#out%:out%=0
  340 CLOSE#in%:in%=0
  350 QUIT
  360 :
  370 DEFPROCprocess
  380 parish$="Whitby"
  390 :
  400 REM Regularise address
  410 postcode$=source$(10)
  420 address$ =source$(11)
  430 A%=11:REPEAT
  440   A%=A%+1:IF source$(A%+1)<>postcode$:address$=address$+", "+source$(A%)
  450 UNTIL source$(A%+1)=postcode$ OR A%=max%-1
  460 address$=FNswap(address$,"&, ","& ")
  470 address$=FNswap(address$,"At, ","At ")
  480 address$=FNswap(address$,"Fl ","Floor ")
  490 address$=FNswap(address$,"Flt ","Flat ")
  500 address$=FNswap(address$,"Hse,","House,")
  510 address$=FNswap(address$,"Albi0N","Albion")
  520 address$=FNswap(address$,"Flt, 1","Flat 1")
  530 address$=FNswap(address$,"Flt, 2","Flat 2")
  540 address$=FNswap(address$,"Flt, 3","Flat 3")
  550 address$=FNswap(address$,"Flt, 4","Flat 4")
  560 address$=FNswap(address$,"Flat 1 ","Flat 1, ")
  570 address$=FNswap(address$,"Flat 2 ","Flat 2, ")
  580 address$=FNswap(address$,"Flat 3 ","Flat 3, ")
  590 address$=FNswap(address$,"Flat 4 ","Flat 4, ")
  600 address$=FNswap(address$,"Flat 5 ","Flat 5, ")
  610 address$=FNswap(address$,"Flat 6 ","Flat 6, ")
  620 address$=FNswap(address$,"Gard, ","Gardens, ")
  630 address$=FNswap(address$,"Plot, 1 ","Plot 1, ")
  640 address$=FNswap(address$,", Mulberry"," Mulberry")
  650 address$=FNswap(address$,"Apartment, 5","Apartment 5,")
  660 address$=FNswap(address$,"Apartment, 6","Apartment 6,")
  670 address$=FNswap(address$,"Stakesby, Manor","Stakesby Manor")
  680 address$=FNswap(address$,"Routh Walk","Routh Walk, Skinner Street")
  690 REPEAT:address$=FNswap(address$,"  "," "):UNTILINSTR(address$,"  ")=0
  700 :
  710 :
  720 REM Create a Sex field
  730 REM Difficult to assign a sex if nothing to match
  740 REM Will have to try and match personal names
  750 sex$=""
  760 A$=source$(3):REM Look at personal name
  770 A$=FNswap(A$,"Jonathon","Jonathan")
  780 A$=FNswap(A$,"Jonothan","Jonathan")
  790 A$=FNswap(A$,"Johnathon","Jonathan")
  800 A$=FNswap(A$,"Johnothan","Jonathan")
  810 A$=FNswap(A$,"Johnathan","Jonathan")
  820 A$=FNswap(A$,"Wiiliam","William")
  830 A$=FNswap(A$,"Darrren","Darren")
  840 source$(3)=A$
  850 RESTORE +0
  860 READ s$
  870 REPEAT
  880   READ n$
  890   REPEAT
  900     A%=INSTR(A$,"-"):IF A%=0:A%=INSTR(A$+" "," ")
  910     IF A$=n$ OR LEFT$(A$,A%-1)=n$ OR MID$(A$,A%+1)=n$:sex$=s$
  920     READ n$
  930   UNTILn$="*" OR sex$<>""
  940   READ s$
  950 UNTILs$="*" OR sex$<>""
  960 IF sex$="F":sex$="Female"
  970 IF sex$="M":sex$="Male"
  980 :
  990 DATA M
 1000 DATA John,David,Michael,Paul,Peter,Andrew,James,Richard,Robert,Stephen,Christopher,William,Ian,Mark,Alan
 1010 DATA Anthony,Thomas,Brian,George,Simon,Colin,Steven,Daniel,Kenneth,Neil,Philip,Joseph,Jonathan,Kevin
 1020 DATA Matthew,Raymond,Martin,Stuart,Barry,Ronald,Derek,Charles,Keith,Edward,Lee,Graham,Eric,Gary,Geoffrey
 1030 DATA Trevor,Leslie,Jason,Roger,Adam,Darren,Timothy,Terence,Malcolm,Dennis,Benjamin,Arthur,Donald,Samuel
 1040 DATA Nicholas,Craig,Carl,Adrian,Harold,Wayne,Nigel,Gordon,Luke,Jamie,Ryan,Frederick,Shaun,Norman,Francis
 1050 DATA Duncan,Ernest,Scott,Stanley,Marc,Patrick,Rodney,Sean,Harry,Henry,Frank,Nathan,Alexander,Jack,Douglas
 1060 DATA Stewart,Bernard,Jeffrey,Howard,Edwin,Allan,Garry,Albert,Gareth,Russell,Lawrence,Liam,Dean,Martyn
 1070 DATA Graeme,Ralph,Jeremy,Vincent,Karl,Joshua,Clifford,Justin,Shane,Tom,Sam,Victor,Cyril,Bryan,Oliver,Hugh
 1080 DATA Ben,Aaron,Fred,Jordan,Terry,Barrie,Ricky,Christian,Phillip,Gerald,Carly,Alfred,Denis,Leonard,Desmond
 1090 DATA Cedric,Reginald,Clive,Sidney,Laurence,Grant,Arron,Lewis,Gregory,Glen,Callum,Danny,Owen,Wilfred,Alex
 1100 DATA Louis,Marcus,Miles,Vivien,Gavin,Kieran,Jon,Damien,Ivan,Dale,Declan,Melvyn,Dominic,Warren,Walter
 1110 DATA Jeffery,Julian,Mervyn,Noel,Ashley,Damian,Ross,Antony,Alec,Micheal,Iain,Herbert,Ivor,Vernon,Joel
 1120 DATA Bruce,Maurice,Godfrey,Kenny,Angus,Gilbert,Neale,Neville,Alastair,Archibald,Mathew,Edgar,Mitchell
 1130 DATA Gerard,Jo,Tony,Calum,Arnold,Errol,Alistair,Glenn,Derrick,Lloyd,Damon,Allen,Kelvin,Steve,Aidan,Dalton
 1140 DATA Darran,Lionel,Nick,Fredrick,Alain,Glynn,Horace,Mike,Clarence,Abbi,Pete,Lancelot,Harvey,Stephan,Sammy
 1150 DATA Freddie,Mohamed,Allister,Daren,Percy,Jacob,Jimmy,Cornelius,Xavier,Justine,Derick,Greg,Darron,Nicolas
 1160 DATA Alfie,Marvin,Christofer,Terrence,Carlos,Bill,Dave,Andre,Winston,Emma,Edmund,Erwin,Austin,Derren,Amos
 1170 DATA Clint,Billy,Kieron
 1180 DATA Abdul,Brent,Byron,Calvin,Cecil,Connor,Duane,Geoff,Gerrald,Issac,Joe,Kirk,Lester,Rob,Robin,Roy,Rueben
 1190 DATA Saul,Simeon,Toby,Tristan,Tyrone,Barrington,Chad,Ethan,Frankland,Frazer,Garfield,Gerry,Giles,Huw
 1200 DATA Kristoffer,Morris,Rex,Rory,Stefan,Tobias,Ritson,Barnaby,Don,Josh,Les,Louie,Max,Richie,Vincente
 1210 :
 1220 DATA *,F
 1230 DATA Margaret,Susan,Patricia,Mary,Christine,Elizabeth,Jean,Barbara,Linda,Karen,Julie,Sarah,Ann,Jane,Helen,Kathleen
 1240 DATA Maureen,Joan,Jennifer,Nicola,Carol,Joyce,Dorothy,Anne,Judith,Alison,Janet,Joanne,Sheila,Wendy,Rebecca,Emma
 1250 DATA Catherine,Gillian,Jacqueline,Amanda,Valerie,Pauline,Pamela,Lisa,Deborah,Victoria,Elaine,Doreen,Michelle
 1260 DATA Laura,Sandra,Heather,Rachel,Sharon,Ruth,Brenda,Louise,Eileen,Audrey,Lesley,Sylvia,Angela,Samantha,Claire
 1270 DATA Irene,June,Sally,Marjorie,Tracy,Amy,Maria,Shirley,Diane,Donna,Carole,Paula,Hannah,Fiona,Rosemary,Rita
 1280 DATA Natalie,Hazel,Dawn,Kathryn,Beryl,Kerry,Olive,Betty,Denise,Lorraine,Caroline,Gemma,Joanna,Marion,Lynne
 1290 DATA Melanie,Jill,Hilda,Lynda,Leanne,Stephanie,Florence,Sophie,Charlotte,Jessica,Yvonne,Doris,Julia,Josephine
 1300 DATA Jayne,Edith,Lucy,Marie,Cheryl,Katie,Avis,Clare,Mavis,Kelly,Jeanette,Carolyn,Andrea,Winifred,Tracey,Lynn
 1310 DATA Emily,Elsie,Katherine,Sara,Christina,Anna,Frances,Beverley,Zoe,Diana,Janice,Jenny,Teresa,Freda,Nora,Kate
 1320 DATA Lorna,Alice,Annie,Jade,Kirsty,Stacey,Tina,Veronica,Norma,Debra,Gwendoline,Danielle,Agnes,Kim,Hayley,Ida
 1330 DATA Bridget,Phyllis,Joy,Stella,Grace,Rachael,Vera,Iris,Jodie,Tanya,Eleanor,Ellen,Penelope,Marilyn,Alexandra
 1340 DATA Violet,Juliet,Jillian,Jemma,Lindsey,Daphne,Nicole,Katrina,Lily,Gail,Myra,Megan,Ada,Rose,Enid,Lindsay
 1350 DATA Dianne,Gladys,Janine,Mandy,Faye,Evelyn,Esther,Theresa,Thelma,Cynthia,Edna,Aileen,Vanessa,Avril,Annette
 1360 DATA Gwyneth,Marian,Naomi,Nancy,Muriel,Mildred,Allison,Marlene,Olivia,Olga,Kay,Philippa,Lilian,Rosalind
 1370 DATA Georgina,Toni,Lillian,Lauren,Eva,Keeley,Lyndsay,Chloe,Ruby,Rhiannon,Monica,Miriam,Abigail,Michele,Nadine
 1380 DATA Bethany,Sonia,Melissa,Marina,Mollie,Rosie,Jenna,Karina,Anita,Zara,Debbie,Rosemarie,Cathryn,Carla,Jenni
 1390 DATA Rikki,Lydia,Eunice,Moira,Constance,Marianne,Glynis,Cassie,Suzanne,Tiffany,Anthea,Kerrie,Vikki,Greta
 1400 DATA Helena,Priscilla,Kayleigh,Mabel,Roberta,Jennie,Rosalyn,Charlene,Francesca,Gina,Jodi,Nichola,Honor,Rosina
 1410 DATA Vivienne,Judy,Rebekah,Isobel,Geraldine,Beatrice,Sadie,Cordelia,Gloria,Erica,Bessie,Hope,Jasmine,Chantelle
 1420 DATA Flora,Marcia,Rosaleen,Marguerite,Martha,Williamina,Eveline,Kristina,Katharine,Maxine,Elisabeth,Heidi
 1430 DATA Juliette,Nina,Glenys,Jocelyn,Harriet,Deirdre,Maisie,Sybil,Nellie,Selina,Amber,Michaela,Carrie,Jeannette
 1440 DATA Philomena,Laureen,Isabel,Tim,Monika,Belinda,Terri,Florance,Kimberley,Adele,Loraine,Sonja,Ingrid,May,Jackie
 1450 DATA Janette,Gwendolyn,Christy,Una,Eliza,Kaylea,Vicky,Ivy,Alyson,Robyn,Tara,Kara,Rhoda,Kirstie,Celia,Molly
 1460 DATA Madeline,Jaclyn,Holly,Rosalie,Noreen,Colleen,Beth,Jessie,Matilda,Lyn,Coral,Beverly,Jeannie,Myrna,Chelsie
 1470 DATA Serena,Zelda,Jannette,Madeleine,Dionne,Margarette,Roslyn,Marelyn,Cassandra,Lea,Juanita,Haydn,Susannah
 1480 DATA Allyson,Stephania,Kristie,Antonella,Colette,M,Berenice,Donnella,Ursula,G,Hollie,Rosamond,Jolene,Antonia
 1490 DATA Yasmin,Brigette,Morag,Roseanne,Paulette,Rosaline,Kathlyn,Crystal,Cara,Kylee,Ethelinda,Adela,Cathrine
 1500 DATA Sabina,Rhona,Poppy,Teri,Gertrude,Queenie,Corrine,Angelique,Peppa,Roxann,Annabel,Rosamund,Clair,Melody
 1510 DATA Vicki,Helga,Ellie,Magdalena,Dinah,Kaylee,Gabrielle,Alissa,Natasha,Meg,Eve,Amelia,Bryony,Vanda,Katy,Clara
 1520 DATA Siobhan,Jaqualine,Kimberly,Andrena,Nikki,Bette,Roxanne,Suzie,Ethel,Rozanne,Cherry,Sheenagh,Margot,Angie
 1530 DATA Liselotte,Susanna,Bronwen,Aimee,Tessa,Sydney,Chrystal,Rosalee,Vickie,Roseanna,Delia,Johanna,Coreen,Lucille
 1540 DATA Brigid,Katarina,Becky,Julianne,Tracie,Claudia,Maggie,Aleshia,Ella,Suzy,Gwennoth,Suzanna,Ava,Lana,Andreena
 1550 DATA Rebecka,Kathrine,Pollyanna,Cathleen,Nicholla,Bertha,Pamala,Sheelagh,Winafrid,Wilhelmina,Stephenie,Winefride
 1560 DATA Adrienne,Bettie,Camilla,Roslyne,Alisha,Louisa,Virginia,Sylvie,Peggy,Anastasia,Deb,Gwenneth,Winnie,Bessy
 1570 DATA Ashlea,Caitlin,Chelcea,Cherie,Clarissa,Collette,Deirdre,Dianna,Effie,Erika,Fenella,Georgia,Gill,Glenda
 1580 DATA Inmaculada,Monica,Jacinth,Jamielee,Jeana,Madge,Margo,Millicent,Nadia,Niki,Regina,Robina,Ruebina,Serendipity
 1590 DATA Stefenie,Suelene,Suzette,Svetlana,Trudy,Pearl,Ana,Berverlie,Birgitta,Catriona,Claudine,Deanna,Deidre,Dolores
 1600 DATA Dora,Elfrieda,Estelle,Gaynor,Isla,Katryna,Linsay,Linzi,Linzie,Lola,Lora,Lynzee,Marylyn,Tammy,Tamsin,Trudi
 1610 DATA Auriel,Auriol,Beverlie,Dilys,Lizzie,Lois,Marrissa,Paige,Tyra,Xylia
 1620 DATA *,*
 1630 :
 1640 :
 1650 REM Arrange in output array
 1660 info$()=""
 1670 info$(0) =""                        :REM HOUSEHOLD NUMBER
 1680 info$(1) =source$(4)                :REM SURNAME
 1690 info$(2) =source$(3)                :REM NAME
 1700 info$(3) =""                        :REM AGE
 1710 info$(4) =""                        :REM RELATIONSHIP
 1720 info$(5) =sex$                      :REM GENDER
 1730 info$(6) =""                        :REM MARITAL STATUS
 1740 info$(7) =address$                  :REM STREET ADDRESS
 1750 info$(8) =""                        :REM OCCUPATION
 1760 info$(9) =""                        :REM BIRTH YEAR
 1770 info$(10)=""                        :REM BIRTH PLACE
 1780 info$(11)=""                        :REM BIRTH COUNTY
 1790 info$(12)=""                        :REM BIRTH COUNTRY
 1800 info$(13)=source$(1)+":"+source$(2) :REM INDIVIDUAL NUMBER, PD:NUM
 1810 info$(14)=parish$                   :REM CIVIL PARISH
 1820 REM info$(15)="Whitby"              :REM REGISTRATION DISTRICT
 1830 REM info$(16)=""                    :REM REGISTRATION DISTRICT NUMBER
 1840 info$(15)="Whitby"                  :REM SUB-REGISTRATION DISTRICT
 1850 info$(16)=""                        :REM ED, INSTITUTION, OR VESSEL
 1860 info$(17)=""                        :REM PIECE
 1870 info$(18)=""                        :REM PAGE
 1880 info$(19)=""                        :REM FOLIO
 1890 info$(20)=postcode$                 :REM POSTCODE
 1900 :
 1910 IF verbose%:FOR A%=0 TO max%:PRINTTAB(36,A%+2);LEFT$(info$(A%),56);SPC(56-LENLEFT$(info$(A%),56));:NEXT
 1920 ENDPROC
 1930 :
 1940 :
 1950 DEFFNadd(addr$,yard$,street$)
 1960 IF INSTR(addr$,yard$+" "):IF INSTR(addr$,street$)=0:=addr$+", "+street$
 1970 IF RIGHT$(addr$,LENyard$)=yard$:IF INSTR(addr$,street$)=0:=addr$+", "+street$
 1980 =addr$
 1990 :
 2000 DEFFNswap(in$,match$,swap$)
 2010 A%=INSTR(in$,match$):IF A%:in$=LEFT$(in$,A%-1)+swap$+MID$(in$,A%+LENmatch$)
 2020 =in$
 2030 :
 2040 :
 2050 DEFPROCClose_All
 2060 out%=out%:IFout%:A%=out%:out%=0:CLOSE#A%
 2070 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
 2080 ENDPROC
 2090 :
 2100 DEFFNd0(A%,N%)=RIGHT$("00000000"+STR$A%,N%)
 2110 DEFFNuc(A$):LOCAL B$:IFA$="":=""
 2120 REPEATB$=B$+CHR$(ASCA$AND((A$<"@")OR&DF)):A$=MID$(A$,2):UNTILA$="":=B$
 2130 DEFFNlc(A$):LOCAL B$:IFA$="":=""
 2140 REPEATB$=B$+CHR$(ASCA$OR((A$<"_")AND&20)):A$=MID$(A$,2):UNTILA$="":=B$
 2150 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
 2160 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
 2170 =A$
 2180 :
 2190 DEFPROCcsv_rd(i%,array$())
 2200 LOCAL n%:n%=0:array$()="":A$=GET$#i%:IFA$="":A$=GET$#i%
 2210 A$=A$+","
 2220 REPEAT
 2230   IF LEFT$(A$,2)="=""":A$=MID$(A$,2)
 2240   IF LEFT$(A$,1)="""" THEN
 2250     A%=INSTR(A$,""",",2)+1:array$(n%)=MID$(A$,2,A%-3)
 2260   ELSE
 2270     A%=INSTR(A$,","):array$(n%)=LEFT$(A$,A%-1)
 2280   ENDIF
 2290   A$=MID$(A$,A%+1):n%=n%+1
 2300 UNTILA$=""
 2310 ENDPROC
 2320 :
 2330 DEFPROCcsv_wr(o%,array$())
 2340 LOCAL n%,q%:n%=DIM(array$(),1)
 2350 FOR A%=0 TO n%:A$=array$(A%)
 2360   q%=INSTR(A$,",")
 2370   IF q%=0:q%=(ASCA$=48)AND(INSTR(A$,"/")=0)     :REM leading zeros 00001
 2380   IF q%=0:IFVALLEFT$(A$,1):q%=INSTR(A$,"E")     :REM preserve 1234E5678
 2390   IF q%=0:q%=LENSTR$VALA$>8                     :REM long numbers 12345678901234
 2400   IF q%=0:IFVALA$:q%=INSTR(A$,"/")AND(ASCA$<>48):REM fractions 12/34
 2410   IF q%=0:q%=LEFT$(A$,1)="-"                    :REM leading hyphen -
 2420   IF q%=0:q%=MID$(A$,3,1)=" "ANDMID$(A$,7,1)=" ":REM dates xx XXX xxxx
 2430   IF q%:A$=""""+A$+"""":IFINSTR(A$,",")=0:A$="="+A$
 2440   BPUT#o%,A$;:IF A%<>n%:BPUT#o%,",";
 2450 NEXT A%:BPUT#o%,""
 2460 ENDPROC