PROCEDURE __dbDelim( lNoAppend, cFile, cDelim, aFields, ;
bFor, bWhile, nNext, nRec, lRest, lMode, lNoHead )
LOCAL i, nH, aName, nPost, nLen, nCol, cIni, aRet,;
nScan, aStruct := {}, cExt, lWinMode, lHead, nMaxRow := 0,;
cTemp, cArea, cLine, xPut, aSet := {}, cFilter, bFilter
IF ISNIL(aFields)
aFields := {}
FOR i := 1 TO FCOUNT()
AADD(aFields, FIELDNAME(i))
NEXT
ENDIF
nLen := LEN(aFields)
bWhile := IIF(ISNIL(bWhile), {|| !EOF()}, bWhile)
bFor := IIF(ISNIL(bFor), {|| .T.}, bFor)
nRec := IIF(ISNIL(nRec), 1, nRec)
nNext := IIF(ISNIL(nNext), 1, nNext)
lRest := IIF(ISNIL(lRest), .T., lRest)
cDelim := IIF(ISNIL(cDelim), ",", cDelim)
lMode := IIF(ISNIL(lMode), .T., lMode)
lNoHead := IIF(ISNIL(lNoHead), .F., lNoHead)
DO CASE
CASE lNoAppend
IF (nH := FCREATE(cFile, FC_NORMAL)) != -1
nCol := 0
IF !lNoHead
AEVAL(aFields, {|cName| FWRITE(nH, STRTRAN(ALLTRIM(GT_X2Char(cName)), CHR(34), CHR(39)) + IIF(++nCol != nLen, cDelim, SPACE(0)))})
FWRITE(nH, CHR(13) + CHR(10))
ENDIF
dbGoto(nRec)
DO WHILE EVAL(bWhile)
IF EVAL(bFor)
nCol := 0
AEVAL(aFields, {|cName| FWRITE(nH, ALLTRIM(GT_X2Char(FIELDGET(FIELDPOS(cName)))) + IIF(++nCol != nLen, cDelim, SPACE(0)))})
FWRITE(nH, CHR(13) + CHR(10))
ENDIF
IF !lRest
IF ++nPost >= nNext
EXIT
ENDIF
ENDIF
dbSkip()
ENDDO
FCLOSE(nH)
ENDIF
CASE !lNoAppend
cIni := SUBSTR(cFile, 0, RAT("\", cFile) - 1) + "\Schema.ini"
IF FILE(cIni)
aRet := ReadIni(cIni, SUBSTR(cFile, RAT("\", cFile) + 1), .T.)
IF (nScan := ASCAN(aRet, {|aName| UPPER(aName[1]) == "FORMAT"})) != 0
cExt := STRTRAN(aRet[nScan, 2], "(", "(" + CHR(34))
cExt := STRTRAN(cExt, "

", CHR(34) + "

"

cDelim := &(cExt)
aRet := ADEL(aRet, nScan)
aRet := ASIZE(aRet, LEN(aRet) - 1)
ENDIF
IF (nScan := ASCAN(aRet, {|aName| UPPER(aName[1]) == "COLNAMEHEADER"})) != 0
IF UPPER(aRet[nScan, 2]) == "TRUE"
lHead := .T.
ELSE
lHead := .F.
ENDIF
aRet := ADEL(aRet, nScan)
aRet := ASIZE(aRet, LEN(aRet) - 1)
ENDIF
IF (nScan := ASCAN(aRet, {|aName| UPPER(aName[1]) == "CHARACTERSET"})) != 0
lWinMode := IIF(aRet[nScan, 2] == "ANSI", .T., .F.)
aRet := ADEL(aRet, nScan)
aRet := ASIZE(aRet, LEN(aRet) - 1)
ENDIF
IF (nScan := ASCAN(aRet, {|aName| UPPER(aName[1]) == "MAXSCANROWS"})) != 0
nMaxRow := VAL(aRet[nScan, 2])
aRet := ADEL(aRet, nScan)
aRet := ASIZE(aRet, LEN(aRet) - 1)
ENDIF
AEVAL(aRet, {|aName| IIF(AT("COL", UPPER(aName[1])) != 0, AADD(aStruct, GetShema(aName, aSet, lWinMode)), NIL)})
cArea := ALIAS()
// cTemp := GetNTemp(cPathTemp + '\~Txt', 4)
cTemp := GetNTemp(cPathTemp + '\')
// __HelpArr(aStruct, {"Èìå","Ìîäåë","Äúë","Òî÷"}, 1)
dbCreate(cTemp, aStruct, "DBFCDX"

NETUSE(.T.,, cTemp, 'TXTTEMP', .F.)
aSet := TXTTEMP -> (LUPDATESETTINGS(1, ID_EMPTY,, aSet))
ft_fUse(cFile, FO_READ)
IF lHead
ft_fGoto(2)
ENDIF
DO WHILE !ft_fEof()
TXTTEMP -> (dbAppend())
cLine := ft_fReadLn()
// OnLineHelp(cLine)
// Inkey(0)
FOR i := 1 TO TXTTEMP -> (FCOUNT())
xPut := TOKEN(cLine, cDelim, i, LEN(cDelim))
IF aStruct[i, 2] == "N"
xPut := STRTRAN(xPut, ",", SPACE(0))
ENDIF
xPut := GT_Char2X(xPut, aStruct[i, 2])
IF aStruct[i, 2] == "C" .AND. lWinMode
xPut := ConvWinOem(xPut)
ENDIF
TXTTEMP -> (FIELDPUT(i, xPut))
NEXT
aSet := TXTTEMP -> (LUPDATESETTINGS(1, ID_PUT,, aSet))
ft_fSkip()
ENDDO
ft_fUse()
TXTTEMP -> (LUPDATESETTINGS(1, ID_SAVE,, aSet))
TXTTEMP -> (dbCloseArea())
IF !EMPTY(cArea)
SELECT (cArea)
ENDIF
cFile := cTemp
ELSE
IF !EMPTY(cArea := ALIAS())
ft_fUse(cFile, FO_READ)
DO WHILE !ft_fEof()
(cArea) -> (dbAppend())
cLine := ft_fReadLn()
FOR i := 1 TO (cArea) -> (FCOUNT())
(cArea) -> (FIELDPUT(i, GT_Char2X(TOKEN(cLine, cDelim, i, LEN(cDelim)), dbFieldInfo(DBS_TYPE))))
NEXT
ft_fSkip()
ENDDO
ft_fUse()
SELECT (cArea)
ENDIF
ENDIF
ENDCASE
RETURN
STATIC FUNCTION GetShema(aVar, aS, lW)
LOCAL aRet := {}, cName, cAName, cMode, nLen, nDec
cName := aVar[1]
cAName := IIF(LEFT(aVar[2], 1) == CHR(34), STRTRAN(TOKEN(aVar[2], CHR(34), 2, 1), SPACE(1), ";"

, TOKEN(aVar[2], SPACE(1), 1, 1))
cAName := IIF(lW, ConvWinOem(cAName), cAName)
cMode := GetSMode(ALLTRIM(IIF(LEFT(aVar[2], 1) == CHR(34), TOKEN(aVar[2], CHR(34), 3, 1), SUBSTR(aVar[2], AT(SPACE(1), aVar[2])))))
nDec := GetSDec(ALLTRIM(IIF(LEFT(aVar[2], 1) == CHR(34), TOKEN(aVar[2], CHR(34), 3, 1), SUBSTR(aVar[2], AT(SPACE(1), aVar[2])))), @nLen)
aRet := {cName, cMode, nLen, nDec}
AADD(aS, {cName, cAName, cMode, nLen,,})
RETURN aRet
STATIC FUNCTION GetSMode(cMode)
cMode := TOKEN(cMode, SPACE(1), 1, 1)
DO CASE
CASE UPPER(cMode) == "CHAR" .OR. ;
UPPER(cMode) == "LONGCHAR" .OR. ;
UPPER(cMode) == "BIT" .OR. ;
UPPER(cMode) == "BYTE"
cMode := "C"
CASE UPPER(cMode) == "INTEGER" .OR. ;
UPPER(cMode) == "FLOAT" .OR. ;
UPPER(cMode) == "SHORT" .OR. ;
UPPER(cMode) == "SINGLE" .OR.;
UPPER(cMode) == "CURRENCY"
cMode := "N"
CASE UPPER(cMode) == "DATE"
cMode := "D"
ENDCASE
RETURN cMode
STATIC FUNCTION GetSDec(cMode, nWidth)
LOCAL nDec := 0
nWidth := VAL(TOKEN(cMode, SPACE(1), 3, 1))
nWidth := IIF(nWidth == 255, 254, nWidth)
cMode := TOKEN(cMode, SPACE(1), 1, 1)
DO CASE
CASE UPPER(cMode) == "CHAR" .OR. ;
UPPER(cMode) == "LONGCHAR"
CASE UPPER(cMode) == "BIT"
nWidth := 1
CASE UPPER(cMode) == "BYTE"
nWidth := 2
CASE UPPER(cMode) == "INTEGER" .OR. ;
UPPER(cMode) == "FLOAT" .OR. ;
UPPER(cMode) == "SHORT" .OR. ;
UPPER(cMode) == "SINGLE" .OR.;
UPPER(cMode) == "CURRENCY"
nWidth := 15
nDec := 3
CASE UPPER(cMode) == "DATE"
nWidth := 8
ENDCASE
RETURN nDec
FUNCTION Delimited(cDel)
RETURN cDel