回 帖 发 新 帖 刷新版面

主题:请教如何将没有分隔符的文本导入数据表中?

文本没有数据分隔符号,但有列的形式存在,是从另一个软件里面导出来的,请教导入VF数据表的代码?请高手赐教!!!感谢!

回复列表 (共22个回复)

11 楼

再送你一段程序代码 TXT2DBF.PRG

PUBLIC oFRM1
oFRM1=NEWOBJECT("FORM1")
oFRM1.Show
RETURN

DEFINE CLASS FORM1 AS form
Height = 280
Width = 396
DoCreate = .T.
ShowTips = .F.
AutoCenter = .T.
Caption = "TXT To DBF"
TitleBar = 1
BackColor = RGB(236,233,216)
Borderstyle=2
AllowOutput = .F.
Name = "FORM1"

ADD OBJECT LABLE1 AS label WITH ;
AutoSize = .F., ;
FontName = "宋体", ;
FontSize = 9, ;
BackStyle = 0, ;
Caption = "文本文件名", ;
Height = 21, ;
Left = 19, ;
Top = 30, ;
Width = 73, ;
Alignment = 2, ;
ForeColor = RGB(0,0,0), ;
Name = "LABLE1"

ADD OBJECT TEXT1 AS textbox WITH ;
FontSize = 9, ;
Height = 21, ;
InputMask = "", ;
Left = 103, ;
MaxLength = 0, ;
Top = 24, ;
Width = 221, ;
BackColor = RGB(255,255,255), ;
Name = "TEXT1"

ADD OBJECT COMMAND1 AS commandbutton WITH ;
Top = 24, ;
Left = 336, ;
Height = 25, ;
Width = 25, ;
Caption = "...", ;
Name = "COMMAND1"

ADD OBJECT COMMAND2 AS commandbutton WITH ;
Top = 216, ;
Left = 228, ;
Height = 25, ;
Width = 61, ;
Caption = "确 认", ;
Name = "COMMAND2"

ADD OBJECT COMMAND3 AS commandbutton WITH ;
Top = 216, ;
Left = 300, ;
Height = 25, ;
Width = 61, ;
Caption = "退 出", ;
Name = "COMMAND3"

PROCEDURE load
SET STAT OFF
SET SCOR OFF
SET TALK OFF
SET DATE ANSI
SET CENT ON
SET SAFE OFF
SET DELE ON
SET EXACT ON  &&精确比较
ENDPROC

PROCEDURE Init
THISFORM.COMMAND2.enabled=.F.
ENDPROC

PROCEDURE TEXT1.Init
this.Value=""
ENDPROC

PROCEDURE TEXT1.InteractiveChange
THISFORM.COMMAND2.ENABLED=IIF(Len(Thisform.text1.text)>1,.T.,.F.)
ENDPROC

PROCEDURE COMMAND1.Click
THISFORM.text1.value=getf('Text:TXT')
THISFORM.COMMAND2.ENABLED=IIF(Len(Thisform.text1.text)>1,.T.,.F.)
ENDPROC

PROCEDURE COMMAND2.Click
STORE FOPEN(thisform.text1.text) TO nFileHandle
STORE FSEEK(nFileHandle, 0, 2) TO nEnd
STORE FSEEK(nFileHandle, 0) TO nTop
IF nEnd <= 0
    WAIT WINDOW '文件是空的!' NOWAIT
ELSE
    IF !FILE("AA.dbf")
        CREA TABLE D:\VFP\问题\AA(A01 C(5),A02 C(14),A03 C(18),A04 C(40),A05 N(6),A06 C(20),A07 N(12,5),A08 N(12,3),A09 C(40))
    ELSE
        USE AA IN 0
        SELE AA
        DELE ALL
        PACK
    ENDIF
    FOR I=0 TO nEnd
        cStr = FGETS(nFileHandle, nEnd)
        I=FSEEK(nFileHandle, 0,1)
        APPE BLAN
        REPL A01 WITH LEFT(cStr,5),A02 WITH SUBS(cStr,6,14),A03 WITH SUBS(cStr,20,18),A04 WITH SUBS(cStr,38,40),A05 WITH VAL(SUBS(cStr,78,6)),A06 WITH SUBS(cStr,84,20),A07 WITH VAL(SUBS(cStr,104,8)),A08 WITH VAL(SUBS(cStr,112,8)),A09 WITH SUBS(cStr,120)
    NEXT
ENDIF
= FCLOSE(nFileHandle)
THISFORM.COMMAND2.ENABLED=.F.
BROW
RETURN

ENDPROC
PROCEDURE COMMAND3.Click
THISFORM.RELEASE
CLEAR EVENT
ENDPROC
ENDDEFINE

12 楼

sywzs 老师你好,非常感谢你的程序代码,但是还有以下问题:
1.返回的txt表名我觉得有问题,不能正确返回
 STORE FOPEN(thisform.text1.text) TO nFileHandle
比如 D:\SD\KJKLE\3MS234.TXT 实际需要的表名应该是3MS234.TXT,而不是整个路径名称,上面的语句
FOPEN()应该是打开表3MS234.TXT
2.在第2次运行程序的时候出现 文件正在使用 提示(语句是:USE AA IN 0),我觉得是在前面加一个use 命令(第2次打开的时候关闭AA表)
3.我测试了很多文本文件发现只有6HS01.TXT的文件能正确导入,其他的都是空白,也就是不能导入
IF nEnd < 0
    WAIT WINDOW '文件是空的!' NOWAIT
ELSE
这句我该了下,用小于来判断表的内容,发现有些表能导入了,但是绝大部分还是不行,出现了程序函数数目、类型不符 提示。

我再发几个文本文件给老师你测试下,看看我遇到的问题能解决吗,谢谢了!!!

13 楼

改动了一下,看看如何?

********************************
PUBLIC oFRM1
oFRM1=NEWOBJECT("FORM1")
oFRM1.Show
RETURN

DEFINE CLASS FORM1 AS form
Height = 280
Width = 396
DoCreate = .T.
ShowTips = .F.
AutoCenter = .T.
Caption = "TXT To DBF"
TitleBar = 1
BackColor = RGB(236,233,216)
Borderstyle=2
AllowOutput = .F.
Name = "FORM1"

ADD OBJECT LABLE1 AS label WITH ;
AutoSize = .F., ;
FontName = "宋体", ;
FontSize = 9, ;
BackStyle = 0, ;
Caption = "文本文件名", ;
Height = 21, ;
Left = 24, ;
Top = 36, ;
Width = 73, ;
Alignment = 2, ;
ForeColor = RGB(0,0,0), ;
Name = "LABLE1"

ADD OBJECT LABLE2 AS label WITH ;
AutoSize = .F., ;
FontName = "宋体", ;
FontSize = 9, ;
BackStyle = 0, ;
Caption = "输出文件名", ;
Height = 21, ;
Left = 24, ;
Top = 66, ;
Width = 73, ;
Alignment = 2, ;
ForeColor = RGB(0,0,0), ;
Name = "LABLE2"

ADD OBJECT TEXT1 AS textbox WITH ;
FontSize = 9, ;
Height = 25, ;
InputMask = "", ;
Left = 108, ;
MaxLength = 0, ;
Top = 30, ;
Width = 221, ;
BackColor = RGB(255,255,255), ;
Name = "TEXT1"

ADD OBJECT TEXT2 AS textbox WITH ;
FontSize = 9, ;
Height = 25, ;
InputMask = "", ;
Left = 108, ;
MaxLength = 0, ;
Top = 60, ;
Width = 221, ;
BackColor = RGB(255,255,255), ;
Name = "TEXT2"

ADD OBJECT COMMAND1 AS commandbutton WITH ;
Top = 30, ;
Left = 341, ;
Height = 25, ;
Width = 25, ;
Caption = "…", ;
Name = "COMMAND1"

ADD OBJECT COMMAND4 AS commandbutton WITH ;
Top = 60, ;
Left = 341, ;
Height = 25, ;
Width = 25, ;
Caption = "…", ;
Name = "COMMAND4"

ADD OBJECT COMMAND2 AS commandbutton WITH ;
Top = 216, ;
Left = 228, ;
Height = 25, ;
Width = 61, ;
Caption = "确 认", ;
Name = "COMMAND2"

ADD OBJECT COMMAND3 AS commandbutton WITH ;
Top = 216, ;
Left = 300, ;
Height = 25, ;
Width = 61, ;
Caption = "退 出", ;
Name = "COMMAND3"

PROCEDURE load
SET STAT OFF
SET SCOR OFF
SET TALK OFF
SET DATE ANSI
SET CENT ON
SET SAFE OFF
SET DELE ON
SET EXACT ON  &&精确比较
ENDPROC

PROCEDURE Unload
ENDPROC

PROCEDURE Init
thisform.COMMAND2.enabled=.F.
ENDPROC

PROCEDURE TEXT1.Init
this.Value=""
ENDPROC

PROCEDURE TEXT1.InteractiveChange
THISFORM.COMMAND2.ENABLED=IIF(Len(Thisform.text1.text)>1 and Len(Thisform.text2.text)>1,.T.,.F.)
ENDPROC

PROCEDURE TEXT2.InteractiveChange
THISFORM.COMMAND2.ENABLED=IIF(Len(Thisform.text1.text)>1 and Len(Thisform.text2.text)>1,.T.,.F.)
ENDPROC

PROCEDURE COMMAND1.Click
THISFORM.Text1.VALUE=GETF('Text:TXT')
T1=alltrim(THISFORM.Text1.VALUE)
THISFORM.Text2.VALUE=left(t1,len(t1)-3) + "DBF"
THISFORM.COMMAND2.ENABLED=IIF(Len(Thisform.text1.text)>1 and Len(Thisform.text2.text)>1,.T.,.F.)
ENDPROC

PROCEDURE COMMAND2.Click
STORE FOPEN(THISFORM.Text1.TEXT) TO nFileHandle
STORE FSEEK(nFileHandle, 0, 2) TO nEnd
STORE FSEEK(nFileHandle, 0) TO nTop
IF nEnd <= 0
    WAIT WINDOW '文件是空的!' NOWAIT
ELSE
    cPUT=alltrim(THISFORM.Text2.TEXT)
    IF !FILE(cPUT)
        cput=subs(cput,1,len(cput)-4)
        CREA TABLE &cPUT.(A01 C(5),A02 C(14),A03 C(18),A04 C(40),A05 N(6),A06 C(20),A07 N(12,5),A08 N(12,3),A09 C(40))
    ELSE
        SELE A
        USE AA
        DELE ALL
        PACK
    ENDIF
    FOR I=0 TO nEnd
        cStr = FGETS(nFileHandle, nEnd)
        I=FSEEK(nFileHandle, 0,1)
        APPE BLAN
        REPL A01 WITH LEFT(cStr,5),A02 WITH SUBS(cStr,6,14),A03 WITH SUBS(cStr,20,18),A04 WITH SUBS(cStr,38,40),A05 WITH VAL(SUBS(cStr,78,6)),A06 WITH SUBS(cStr,84,20),A07 WITH VAL(SUBS(cStr,104,8)),A08 WITH VAL(SUBS(cStr,112,8)),A09 WITH SUBS(cStr,120)
    NEXT
ENDIF
= FCLOSE(nFileHandle)
THISFORM.BORDERSTYLE=3
BROW
THISFORM.BORDERSTYLE=2
ENDPROC

PROCEDURE COMMAND3.Click
thisform.Release
CLEAR EVENT
ENDPROC

PROCEDURE COMMAND4.Click
thisform.text2.value=PUTFILE('','','DBF')
THISFORM.COMMAND2.ENABLED=IIF(Len(Thisform.text1.text)>1 and Len(Thisform.text2.text)>1,.T.,.F.)
ENDPROC
ENDDEFINE

14 楼

非常感谢你的回帖,谢谢!!
但是好像还是不行啊,有以下几个问题:
1、还是没判断到文本文件的内容,数据表里面是空的
2、多次运行程序以后提示 语法错误 
CREA TABLE &cPUT.(A01 C(5),A02 C(14),A03 C(18),A04 C(40),A05 N(6),A06 C(20),A07 N(12,5),A08 N(12,3),A09 C(40))
3、多次运行程序以后提示 找不到AA.DBF
        SELE A
        USE AA
        DELE ALL
        PACK
好像现在没有用到AA表吧,为什么这里要打开AA表呢 ,而且上面一句是select A 请问A和AA是一样的吗,我没搞明白,请老师说明下?
4、每次运行程序以后打开文本文件后,都要建立一个相同文件名的数据表,可否用一个临时表代替,
这样在正常运行以后数据库不会膨胀!

麻烦老师再费下心,帮小弟解决下问题摆脱了!

15 楼

绝缘子2009,我已将如下代码段修改了,你再看看还有什么问题。

PROCEDURE COMMAND2.Click
cGET=alltrim(THISFORM.Text1.TEXT)
IF LOWER(RIGHT(cGET,4))<>".txt"
    cGET=cGET+".txt"
ENDIF
IF !FILE(cGET)
    MESSAGEBOX("文本文件不存在!",0," 请注意")
    RETURN 
ENDIF
STORE FOPEN(cGET) TO nFileHandle
STORE FSEEK(nFileHandle, 0, 2) TO nEnd
STORE FSEEK(nFileHandle, 0) TO nTop
IF nEnd <= 0
    MESSAGEBOX("文件是空的!",0," 请注意")
    = FCLOSE(nFileHandle)
    RETURN 
ELSE
    cPUT=alltrim(THISFORM.Text2.TEXT)
    IF LOWER(RIGHT(cPUT,4))<>".dbf"
        cPUT=cPUT+".DBF"
    ENDIF
    IF !FILE(cPUT)
        cPUT=subs(cput,1,len(cput)-4)
        CREA TABLE &cPUT.(A01 C(5),A02 C(14),A03 C(18),A04 C(40),A05 N(6),A06 C(20),A07 N(12,5),A08 N(12,3),A09 C(40))
    ELSE
        SELE A
        USE &cPUT
        DELE ALL
        PACK
    ENDIF
    FOR I=0 TO nEnd
        cStr = FGETS(nFileHandle, nEnd)
        I=FSEEK(nFileHandle, 0,1)
        APPE BLAN
        REPL A01 WITH LEFT(cStr,5),A02 WITH SUBS(cStr,6,14),A03 WITH SUBS(cStr,20,18),A04 WITH SUBS(cStr,38,40),A05 WITH VAL(SUBS(cStr,78,6)),A06 WITH SUBS(cStr,84,20),A07 WITH VAL(SUBS(cStr,104,8)),A08 WITH VAL(SUBS(cStr,112,8)),A09 WITH SUBS(cStr,120)
    NEXT
ENDIF
= FCLOSE(nFileHandle)
THISFORM.BORDERSTYLE=3
BROW
THISFORM.BORDERSTYLE=2
ENDPROC

*****************

原来的 USE AA 是我先前写的,修改时忘了改了。

*****************

如果你不需要保存数据文件的话,可以把

    cPUT=alltrim(THISFORM.Text2.TEXT)
    IF LOWER(RIGHT(cPUT,4))<>".dbf"
        cPUT=cPUT+".DBF"
    ENDIF
    IF !FILE(cPUT)
        cPUT=subs(cput,1,len(cput)-4)
        CREA TABLE &cPUT.(A01 C(5),A02 C(14),A03 C(18),A04 C(40),A05 N(6),A06 C(20),A07 N(12,5),A08 N(12,3),A09 C(40))
    ELSE
        SELE A
        USE &cPUT
        DELE ALL
        PACK
    ENDIF

改成

        CREA CURSOR ABC(A01 C(5),A02 C(14),A03 C(18),A04 C(40),A05 N(6),A06 C(20),A07 N(12,5),A08 N(12,3),A09 C(40))

************

另外,整个程序只是给你提供一个参考,你应根据实际情况作适当处理,比如字段的类型,字段的长度等等。还有就是2131.TXT等文件与6HS01.TXT好象还有些不同,在程序中将相应的行进行合并处理。

16 楼

非常感谢老师的代码,也谢谢你的耐心指教,但是问题还是没解决(14楼的问题),我也想试着更改一些东西,但是功力太低了。。。。,估计是我的文本文件的内容有问题,老是说文件是空的,但是直接打开里面是有内容的,也就是说程序的判断条件有些问题,没有找到合适的规律,现在老师给的代码好像是从文件的开头到文件尾部判断内容是否大于0的值,我总觉得这个判断条件有问题,我自己在研究下,也希望老师如果有耐心再帮我分析一下吧,谢谢!!!!

17 楼

你用的是VFP9吧,VFP9就存在这个问题,还是用VFP6吧,VFP6比较稳定。

18 楼

我刚才检查了下我的文本文件,发现有些文件开头第1列和第1行都是空的,是不是这样就不能判断文件的内容了,也就是说文本文件为空?

19 楼

你可以把文本文件中的空行删除;
或者
在程序中每读入一行判断是否为空值,如果是,则跳过。

20 楼

APPEND FROM FileName  ......DELIMITED WITH BLANK 

如果没有分隔符怎么判断列?
空格也是分隔符!

我来回复

您尚未登录,请登录后再回复。点此登录或注册