REM > JoinAll
      REM Join individual voting CSV files together
      REM Uses filename as polling district code
      REM Run from a batch file in the CSV directory containing:
      REM      cd %0\..
      REM      (path-to-JoinAll)\JoinAll.bbc  (eg ..\JoinAll.bbc)
      :
      :
      ON ERROR PRINT:REPORT:WAIT 100:QUIT
      DIM X% 255:SYS "GetCurrentDirectory",255,X%:csd$=$$X%
      outpath$=FNfn_path(csd$)
      outfile$=FNfn_leaf(csd$)
      outyear$=FNfn_leaf(LEFT$(outpath$,LENoutpath$-1))
      outpre$ =outpath$+outfile$+outyear$+"-"
      DIM look$(9)
      :
      PROCdo("postal")
      PROCdo("nonpostal")
      WAIT 100
      QUIT
      :
      DEFPROCdo(sfx$)
      van$=""
      look%=0
      full%=FALSE
      out%=OPENOUT(outpre$+sfx$+".csv")
      in%=OPENIN("header.txt")
      IF in% THEN
        head$=GET$#in%:IF NOT EOF#in%:A$=GET$#in%:look%=OPENIN(A$):IF NOT EOF#in%:full%=(GET$#in%="FULL")
        CLOSE#in%:in%=0
      ENDIF
      IF look%:BPUT#out%,"VANID,";
      BPUT#out%,"PD,NUM,";
      IF look%:BPUT#out%,"VOTED?,";
      BPUT#out%,"voted-"+sfx$+" - "+head$
      FOR char1%=ASC"A" TO ASC"Z"+9:char1$=CHR$char1%:IF char1$>"Z":char1$=STR$(char1%-ASC"Z")
        FOR char2%=ASC"A" TO ASC"Z":char2$=CHR$char2%:IF char2$>"Z":char2$=STR$(char2%-ASC"Z")
          pd$=char1$+char2$
          in%=OPENIN(pd$+"-"+sfx$+".csv")
          IF in%=0:in%=OPENIN(pd$+"-"+sfx$+".txt")
          IF in%=0:IF sfx$="nonpostal":in%=OPENIN(pd$+".csv")
          IF in%=0:IF sfx$="nonpostal":in%=OPENIN(pd$+".txt")
          IF in% THEN
            PRINTpd$;
            REPEAT
              num$=GET$#in%
              IF MID$(num$,3,1)=" ":num$=""
              IF num$<>"" THEN
                A%=INSTR(num$,":"):IF A%:num$=MID$(num$,A%+1)
                IF look%:van$=FNlookup(pd$,num$):BPUT#out%,van$+",";
                BPUT#out%,pd$+","+num$;
                IF look%:BPUT#out%,",Y";
                IF full%:IF van$<>"":BPUT#out%,","+look$(3)+","+look$(4)+","+look$(5);
                BPUT#out%,""
              ENDIF
            UNTILEOF#in%:CLOSE#in%
            PRINT
          ENDIF
        NEXT char2%
      NEXT char1%
      CLOSE#out%
      ENDPROC
      :
      DEFFNlookup(pd$,num$)
      REM format:
      REM 74353515,RA,289,Jonathan Harston,6 Rear Victoria Square,Whitby,YO21 1EA
      :
      PROCfindPD:REM Scan until PD matches
      oldptr%=PTR#look%
      REPEAT
        PROCcsv_rd(look%,look$())
        IF pd$<>look$(1):PTR#look%=0:PROCfindPD:REM Go back to start of this PD block
        match%=(pd$=look$(1) AND num$=look$(2))
      UNTIL match% OR PTR#look%=oldptr%
      IF match%:=look$(0)
      =""
      :
      DEFPROCfindPD
      rescan%=FALSE
      ptr%=PTR#look%:PROCcsv_rd(look%,look$())
      IF pd$<>look$(1) THEN
        REPEAT
          IF EOF#look%:PTR#look%=0:rescan%=TRUE
          ptr%=PTR#look%:PROCcsv_rd(look%,look$())
        UNTIL pd$=look$(1) OR (EOF#look% AND rescan%)
      ENDIF
      PTR#look%=ptr%
      ENDPROC
      :
      DEFPROCcsv_rd(i%,array$())
      LOCAL n%:n%=0:array$()="":A$=GET$#i%:IFA$="":A$=GET$#i%
      A$=A$+","
      REPEAT
        IF LEFT$(A$,2)="=""":A$=MID$(A$,2)
        IF LEFT$(A$,1)="""" THEN
          A%=INSTR(A$,""",",2)+1:array$(n%)=MID$(A$,2,A%-3)
        ELSE
          A%=INSTR(A$,","):array$(n%)=LEFT$(A$,A%-1)
        ENDIF
        A$=MID$(A$,A%+1):n%=n%+1
      UNTILA$=""
      ENDPROC
      :
      DEFFNfn_leaf(A$)
      LOCAL A%:REPEAT:A%=INSTR(A$,"\"):IFA%:A$=MID$(A$,A%+1)
      UNTILA%=0:=A$
      DEFFNfn_path(A$):IFINSTR(A$,"\")=0:=A$
      LOCAL A%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:=LEFT$(A$,B%)