以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]批量导入TXT文件  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=149456)

--  作者:天一生水
--  发布时间:2020/5/2 19:08:00
--  [求助]批量导入TXT文件
老师好!
批量追加导入TXT文件时,可能会产生重复数据。
我想借鉴利用字典批量导入execl文件的方式,如果数据表已有数据的【代码】和【时间】与导入数据相同,那么就覆盖或跳过。
请老师帮助修改一下按钮代码!谢谢!

图片点击可在新窗口打开查看此主题相关图片如下:156.jpg
图片点击可在新窗口打开查看

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:txt导入提问.rar



--  作者:有点蓝
--  发布时间:2020/5/5 11:37:00
--  
MainTable = Tables("股票信息明细表")
\'e.Sender.Enabled = False
Tables("股票信息明细表").StopRedraw()

Dim dlg As New OpenFileDialog
dlg.Filter = "TXT文件|*.TXT"
dlg.MultiSelect = True
If dlg.ShowDialog = DialogResult.Ok Then
    Dim dt As DataTable = DataTables("股票信息明细表")
    For Each file As String In dlg.FileNames
        Dim strs As String = FileSys.ReadAllText(file)
        strs = strs.Trim().Replace(" ", ",").Replace(vblf,"")
        Dim name As String = FileSys.GetName(file.SubString(0, file.length - 4))
        Dim rs() As String = strs.Split(vbcr)
        Dim flag As Boolean
        For i As Integer = 0 To rs.Length - 1
            Dim cs() As String = rs(i).Split(",")
            If cs(0).trim() = "" Then Continue For
            Dim dr As DataRow = dt.Find("代码 = \'" & name & "\' and 时间 = \'" & cs(0) & "\'")
            
            If dr IsNot Nothing Then
                Dim Result = MessageBox.Show("有重复,是否覆盖导入?"& vbcrlf &"是---覆盖导入(将更新原有数据)"& vbcrlf &"否---新增导入(仅增加新数据)", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
                If Result = DialogResult.Yes Then
                    flag = True
                Else
                    flag = False
                End If
                Exit For
            End If
        Next
        For i As Integer = 0 To rs.Length - 1
            Dim cs() As String = rs(i).Split(",")
            If cs(0).trim() = "" Then Continue For
            Dim dr As DataRow = dt.Find("代码 = \'" & name & "\' and 时间 = \'" & cs(0) & "\'")
            
            If dr IsNot Nothing
                If flag = False Then Continue For
            Else
                dr = DataTables("股票信息明细表").Addnew()
            End If
            
            dr("代码") = name
            dr("时间") = cs(0)
            dr("开盘价") = cs(1)
            dr("最高价") = cs(2)
            dr("最低价") = cs(3)
            dr("收盘价") = cs(4)
            dr("成交量") = cs(5)
            dr("金额") = cs(6)
        Next
    Next
    
    dt.DeleteFor("时间 Is Null")
End If

Tables("股票信息明细表").ResumeRedraw()
\'e.Form.Close()
msgbox("导入结束")

--  作者:天一生水
--  发布时间:2020/5/6 16:54:00
--  
谢谢蓝老师!
我测试如果选择覆盖导入时,速度会非常慢。
当表格为空时,如果用普通追加导入实例中三个txt文件,不到0.7秒,但是如果选择覆盖导入会耗时近5秒。是哪里的原因?

--  作者:有点蓝
--  发布时间:2020/5/6 17:10:00
--  
没有办法,要增加判断,就多了一次循环和查找遍历。每一行都要查询是否有旧数据以覆盖。
--  作者:有点蓝
--  发布时间:2020/5/6 17:11:00
--  
可以参考这里自己改进一下
--  作者:天一生水
--  发布时间:2020/5/12 12:08:00
--  
蓝老师好!
如果导入通达信股票软件生成的日线数据,会提示日期列为字符类型(附件中的SH600008),感觉文本文件不会记录下来字符串的格式~
怎样修改一下代码才能通用?
另外,老师提示参考http://www.foxtable.com/webhelp/topics/2225.htm  修改代码,不知道从哪里下手,请老师指教。
谢谢!

图片点击可在新窗口打开查看此主题相关图片如下:001.jpg
图片点击可在新窗口打开查看
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:txt导入提问.rar



--  作者:有点蓝
--  发布时间:2020/5/12 13:36:00
--  
SH600008里面的数据是按tab键分隔的,不是空格

strs = strs.Trim().Replace(" ", ",").Replace(vblf,"")
改为
strs = strs.Trim().Replace(" ", ",").Replace(vbtab, ",").Replace(vblf,"")



--  作者:天一生水
--  发布时间:2020/5/14 15:03:00
--  
请老师帮忙看看计算涨跌幅的代码,存在下列问题:
1、只计算追加数据的涨跌幅,以前计算过的就跳过去,但是行数cn的计数不对;
2、要计算之前是不是要把数据都加载进来,因为刚追加的第一条数据需要利用上一条数据的收盘价;
3、sql外部数据源能不能在后台计算,不加载数据?
代码如下:

Dim cn As Integer = 0   \'计算行数
Dim t As Table = Tables("股票数据")
Dim codes As List (Of String) = DataTables("股票数据").GetValues("代码","","时间")
Dim st As Date = Date.Now
For Each code As String In codes
    Dim drlist As List (Of DataRow) = DataTables("股票数据").Select("代码 = \'" & code & "\'")
    For i As Integer = 0 To drlist.Count - 1
        If drlist(i)("涨跌幅") = Nothing Then   \'如果涨跌幅为空
            cn +=1  \'数据行数
            If i = 0 Then
                drlist(i)("涨跌幅") = (drlist(i)("收盘价") - drlist(i)("开盘价")) / drlist(i)("开盘价") * 1%
            Else
                drlist(i)("涨跌幅") = (drlist(i)("收盘价") - drlist(i - 1)("收盘价")) / drlist(i - 1)("收盘价") * 1%
            End If
        End If
    Next
Next

MessageBox.Show("计算: " & cn & "行数据" & vbcrlf & "耗时: " & (Date.Now - st).TotalSeconds & "秒")



图片点击可在新窗口打开查看此主题相关图片如下:123.jpg
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2020/5/14 15:12:00
--  
1/2、类似流水账的用法,参考:http://www.foxtable.com/webhelp/topics/2136.htm

3、应该是可以的,自行学习一下存储过程的用法。