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 for DIM(), GET$#, BPUT#n,s$
   40 :
   50 DEFPROCcsv_rd(i%,array$())
   60 LOCAL n%:array$()="":A$=GET$#i%:IFA$="":A$=GET$#i%
   70 A$=A$+","
   80 REPEAT
   90   IF LEFT$(A$,2)="=""":A$=MID$(A$,2)
  100   IF LEFT$(A$,1)="""" THEN
  110     A%=INSTR(A$,""",",2)+1:array$(n%)=MID$(A$,2,A%-3)
  120   ELSE
  130     A%=INSTR(A$,","):array$(n%)=LEFT$(A$,A%-1)
  140   ENDIF
  150   A$=MID$(A$,A%+1):n%=n%+1
  160 UNTIL A$="" OR n%>DIM(array$(),1)
  170 ENDPROC
  180 :
  190 DEFPROCcsv_wr(o%,array$())
  200 LOCAL n%,q%:n%=DIM(array$(),1)
  210 FOR A%=0 TO n%:A$=array$(A%)
  220   q%=INSTR(A$,",")
  230   IF q%=0:q%=(ASCA$=48)AND(INSTR(A$,"/")=0)     :REM leading zeros 00001
  240   IF q%=0:IFVALLEFT$(A$,1):q%=INSTR(A$,"E")     :REM preserve 1234E5678
  250   IF q%=0:q%=LENSTR$VALA$>8                     :REM long numbers 12345678901234
  260   IF q%=0:IFVALA$:q%=INSTR(A$,"/")AND(ASCA$<>48):REM fractions 12/34
  270   IF q%=0:q%=LEFT$(A$,1)="-"                    :REM leading hyphen -
  280   IF q%=0:q%=MID$(A$,3,1)=" "ANDMID$(A$,7,1)=" ":REM dates xx XXX xxxx
  290   IF q%:A$=""""+A$+"""":IFINSTR(A$,",")=0:A$="="+A$
  300   BPUT#o%,A$;:IF A%<>n%:BPUT#o%,",";
  310 NEXT A%:BPUT#o%,""
  320 ENDPROC
  330 :