lcTargetData="input_sample.txt"
CLOSE ALL
SET TALK OFF
super_delim_import(lcTargetData,",",CHR(34),.t.) &&file name, comma delim with " character delimiter, header = true
BROWSE NOWAIT
PROCEDURE super_delim_import
LPARAMETERS lcFileName, lcDelim, lcCharDelim, llRow1Header
IF llRow1Header=.t.
lcHeader=" FOR RECNO()>1"
lcAndHeader=" AND RECNO()>1"
ELSE
lcHeader=""
lcAndHeader=""
ENDIF
lnFieldCnt=0
loHandle=FOPEN(lcTargetData)
DO WHILE not Feof(loHandle)
lcString=FGETS(loHandle,3000)
lnFieldCnt=MAX(lnFieldCnt,OCCURS(lcDelim,lcString)) &&field count
ENDDO
CREATE TABLE preImportDBF (Col1 c(254))
FOR lnColCnt = 1 TO lnFieldCnt
ALTER TABLE preImportDBF ADD COLUMN ("col"+TRANSFORM(lnColCnt+1)) c(254)
ENDFOR
?lnFieldCnt
FCLOSE(loHandle)
loHandle=.null.
APPEND FROM (lcTargetData) TYPE DELIMITED WITH CHARACTER &lcDelim WITH &lcCharDelim
SQLImportDBF =""
FOR lnColCnt = 1 TO AFIELDS(laTemp)
CALCULATE MAX(LEN(ALLTRIM(EVALUATE(FIELD(lnColCnt))))) TO lnMaxLen &&determine max len
scan
&& Determine data type
lcFieldType="C" &&starting assumption
locate FOR ("\" $ EVALUATE(FIELD(lnColCnt)) OR ;
"*" $ EVALUATE(FIELD(lnColCnt)) OR ;
"+" $ EVALUATE(FIELD(lnColCnt)) ;
OR "/" $ EVALUATE(FIELD(lnColCnt)) OR ;
("-" $ EVALUATE(FIELD(lnColCnt)) AND ;
LEFT(ALLTRIM(EVALUATE(FIELD(lnColCnt))),1)#"-");
OR type(EVALUATE(FIELD(lnColCnt)))#"N") ;
and LEN(ALLTRIM(EVALUATE(FIELD(lnColCnt))))>0 &lcAndHeader
IF eof()=.t. && Then Number Field or Date Field
lcFieldType="N"
ENDIF
CALCULATE MIN(VAL(EVALUATE(FIELD(lnColCnt)))) TO min_val ;
FOR VAL(EVALUATE(FIELD(lnColCnt)))>0 &lcAndHeader
CALCULATE Max(VAL(EVALUATE(FIELD(lnColCnt)))) TO max_val &lcHeader
CALCULATE MIN((EVALUATE(FIELD(lnColCnt)))) TO min_text_val &lcHeader
CALCULATE Max((EVALUATE(FIELD(lnColCnt)))) TO max_text_val &lcHeader
IF CTOD(min_text_val)#{} AND CTOD(max_text_val)#{} &&then a date type 1
lcFieldType="D"
ENDIF
IF lcFieldType="C" &&Not a Number or Date
calc MAX(LEN(ALLTRIM(EVALUATE(FIELD(lnColCnt))))) to totwidth &lcHeader
ENDIF
IF lcFieldType="N" && Number Field or Date Field
IF year({12/30/1899}+min_val)>=1900 AND (max_val)<70000 &&year 2094, then a date type 2
lcFieldType="D"
ALTER TABLE DBF() alter COLUMN (FIELD(lnColCnt)) c(12) &&make wide enough
REPLACE ALL (FIELD(lnColCnt)) WITH DTOC({12/30/1899}+VAL(EVALUATE(FIELD(lnColCnt)))) ;
FOR VAL(EVALUATE(FIELD(lnColCnt)))>0 &lcAndHeader
ENDIF
IF min_val>=19000000 AND max_val<20940000 &&year 1900,2094, then a date type 3
lcFieldType="D"
ALTER TABLE DBF() alter COLUMN (FIELD(lnColCnt)) c(12) &&make wide enough
REPLACE ALL (FIELD(lnColCnt)) WITH ;
SUBSTR(EVALUATE(FIELD(lnColCnt)),5,2)+"/"+;
RIGHT(ALLTRIM(EVALUATE(FIELD(lnColCnt))),2)+"/"+;
LEFT(EVALUATE(FIELD(lnColCnt)),4) FOR VAL(EVALUATE(FIELD(lnColCnt)))>0 &lcAndHeader
ENDIF
IF lcFieldType="N" &&if still a number
CALCULATE MAX(IIF("." $ EVALUATE(FIELD(lnColCnt))=.f.,0,;
LEN((CHRTRAN(STR(VAL(EVALUATE(FIELD(lnColCnt))),20,9),"0","")))-;
(1+LEN((CHRTRAN(STR(INT(VAL(EVALUATE(FIELD(lnColCnt))))),"0","")))))) TO decimalcnt &lcHeader
decimalcnt=decimalcnt-IIF(decimalcnt=1,1,0)
CALCULATE MAX(LEN(ALLTRIM(STR(ROUND(VAL(EVALUATE(FIELD(lnColCnt))),0),20)))) to basewidth &lcHeader
totwidth=basewidth+decimalcnt+IIF(decimalcnt>0,1,0)
ENDIF
ENDIF
SQLImportDBF=SQLImportDBF+" add column "+("col"+trans(lnColCnt))+;
" "+lcFieldType+iif(lcFieldType="D","","("+;
ALLTRIM(STR(IIF(lcFieldType="D",8,totwidth))))+;
IIF(lcFieldType="N",","+ALLTRIM(STR(IIF(lcFieldType="N",decimalcnt,0)))+")","")+;
IIF(lcFieldType="C",")","")
ENDSCAN
ENDFOR
CREATE TABLE ImportDBF (f1 c(1))
ALTER TABLE ImportDBF &SQLImportDBF drop column f1
APPEND FROM preImportDBF
IF VARTYPE(EVALUATE(FIELD(AFIELDS(latemp))))="N"
CALCULATE MAX(EVALUATE(FIELD(AFIELDS(latemp)))) TO lnTestEmpty
ELSE
CALCULATE MAX(LEN(ALLTRIM(EVALUATE(FIELD(AFIELDS(latemp)))))) TO lnTestEmpty
ENDIF
IF lnTestEmpty=0
ALTER TABLE ImportDBF drop column (FIELD(AFIELDS(latemp)))
ENDIF
IF llRow1Header
GO TOP
DELETE
PACK
ELSE
GO TOP
ENDIF
ENDPROC