10 REM > BLib.FileCSV 1.02 10-Aug-2017
   20 REM Read and write CSV files, protecting entries from Excel
   30 REM Needs BASIC V or equivalent
   40 :
   50 DEFPROCcsv_rd(i%,array$())
   60 LOCAL n%:array$()="":A$=GET$#i%:IFA$="":A$=GET$#i%
   70 REPEAT:A%=INSTR(A$+",",",")
   80   IF LEFT$(A$,1)="""" THEN
   90     A%=INSTR(A$+",",""",")+1:array$(n%)=MID$(A$,2,A%-3)
  100   ELSE
  110     A%=INSTR(A$+",",","):array$(n%)=LEFT$(A$,A%-1)
  120   ENDIF
  130 A$=MID$(A$,A%+1):n%=n%+1:UNTILA$=""
  140 ENDPROC
  150 :
  160 DEFPROCcsv_wr(o%,array$())
  170 LOCAL n%,q%:n%=DIM(array$(),1)
  180 FOR A%=0 TO n%:A$=array$(A%):q%=INSTR(A$,",")
  190   IF q%=0:q%=(ASCA$=48)AND(INSTR(A$,"/")=0)     :REM leading zeros 00001
  200   IF q%=0:IFVALLEFT$(A$,1):q%=INSTR(A$,"E")     :REM preserve 1234E5678
  210   IF q%=0:q%=LENSTR$VALA$>8                     :REM long numbers 12345678901234
  220   IF q%=0:IFVALA$:q%=INSTR(A$,"/")AND(ASCA$<>48):REM fractions 12/34
  230   IF q%=0:q%=MID$(A$,3,1)=" "ANDMID$(A$,7,1)=" ":REM dates xx XXX xxxx
  240   IF q%:A$=""""+A$+"""":IFINSTR(A$,",")=0:A$="="+A$
  250   BPUT#o%,A$;:IF A%<>n%:BPUT#o%,",";
  260 NEXT A%:BPUT#o%,""
  270 ENDPROC
  280 :