好的,不急,谢谢
程序代码:
CLOSE DATABASES ALL
SET SAFETY OFF && 关闭文件删除和覆盖提示
SET DECIMALS TO 4 && 设置浮点数显示小数点后4位
CLEAR
Import_Table("53.TXT", "Table_53")
RETURN
*-----------------------
* 功能:从外部文本文件生成VFP表数据
* 参数:tcDataFileName -- 文本文件名(可带路径)
* tcTableName -- 生成的数据表文件名
* 返回:操作成功为.T.,否则为.F.
*-----------------------
FUNCTION Import_Table(tcDataFileName, tcTableName)
LOCAL lnHandle, lnLine, lcFieldName, lnIndex
LOCAL lnFields, lnRecords
LOCAL llSuccess
OPEN DATABASE DATA1 EXCLUSIVE && 打开数据库
SET DATABASE TO DATA1
USE Dictionary EXCLUSIVE IN 0 && 打开数据字典
* 用低级文件模式打开文本文件
lnHandle = FOPEN(tcDataFileName)
IF lnHandle < 0
MESSAGEBOX("数据文件" + tcDataFileName + "打开失败!", 16)
RETURN .F.
ENDIF
* 跳过前面9行
FOR lnLine = 1 TO 9
FGETS(lnHandle)
NEXT
* 获取字段数
lnFields = INT(VAL(FGETS(lnHandle)))
llSuccess = .T.
* 创建数据表结构
LOCAL laFields[lnFields,18] && 建立数据表结构数组,行数为刚才读得的字段数,列数为结构规定的18列
FOR lnLine = 1 TO lnFields && 依次读入字段名并查找数据字典设置每个字段的结构
lcFieldName = ALLTRIM(FGETS(lnHandle))
SELECT Dictionary
LOCATE ALL FOR ALLTRIM(Dictionary.Field_Name) == lcFieldName
IF !FOUND()
MESSAGEBOX("发现数据字典中没有的字段:" + lcFieldName, 16)
llSuccess = .F.
EXIT
ENDIF
* 将数据字典中该字段的信息复制到结构数组对应行
FOR lnIndex = 1 TO ALEN(laFields,2)
laFields[lnLine,lnIndex] = EVALUATE(FIELD(lnIndex, "Dictionary"))
NEXT
NEXT
USE IN Dictionary && 因为所需的数据结构已抄到数组中,现在不需要数据字典了
IF llSuccess
IF INDBC(tcTableName, "TABLE")
* 如果目标数据表已存在于数据库中,则先移除之
REMOVE TABLE (tcTableName)
ENDIF
* 生成数据空表
CREATE TABLE (tcTableName) NAME (tcTableName) FROM ARRAY laFields
* 导入数据
lnRecords = INT(VAL(FGETS(lnHandle))) && 获取记录数
FOR lnLine = 1 TO lnRecords && 依次读入每条记录
SELECT (tcTableName)
APPEND BLANK
FOR lnIndex = 1 TO lnFields && 依次读入每个字段
LOCAL lcBuffer
* 字段结构数组的使用法:
* 第1列为字段名
* 第2列为字段类型
* 第3列为字段宽度
* 第4列为浮点型字段的小数位数
lcBuffer = FREAD(lnHandle, laFields[lnIndex,3])
DO CASE
CASE laFields[lnIndex,2] == "C"
REPLACE (laFields[lnIndex,1]) WITH lcBuffer
CASE laFields[lnIndex,2] == "N"
REPLACE (laFields[lnIndex,1]) WITH StringToNumeric(lcBuffer, laFields[lnIndex,3], laFields[lnIndex, 4])
ENDCASE
NEXT
FGETS(lnHandle)
NEXT
ENDIF
* 关闭低级文件句柄
FCLOSE(lnHandle)
* 关闭打开的数据库
SET DATABASE TO DATA1
CLOSE DATABASES
* 返回操作结果
RETURN llSuccess
ENDFUNC
*------------------------
* 功能:将字符串转换为浮点数
*------------------------
FUNCTION StringToNumeric(tcString, tnLen, tnDec)
RETURN VAL(LEFT(tcString, tnLen - tnDec - 1) + "." + RIGHT(tcString, tnDec))
ENDFUNC

