Foxtable(狐表)用户栏目专家坐堂 → [求助]批量导入TXT文件


  共有2400人关注过本帖树形打印复制链接

主题:[求助]批量导入TXT文件

帅哥哟,离线,有人找我吗?
天一生水
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1137 积分:11230 威望:0 精华:0 注册:2017/9/26 16:30:00
[求助]批量导入TXT文件  发帖心情 Post By:2020/5/2 19:08:00 [只看该作者]

老师好!
批量追加导入TXT文件时,可能会产生重复数据。
我想借鉴利用字典批量导入execl文件的方式,如果数据表已有数据的【代码】和【时间】与导入数据相同,那么就覆盖或跳过。
请老师帮助修改一下按钮代码!谢谢!

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

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



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107135 积分:544918 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/5/5 11:37:00 [只看该作者]

MainTable = Tables("股piao信息明细表")
'e.Sender.Enabled = False
Tables("股piao信息明细表").StopRedraw()

Dim dlg As New OpenFileDialog
dlg.Filter = "TXT文件|*.TXT"
dlg.MultiSelect = True
If dlg.ShowDialog = DialogResult.Ok Then
    Dim dt As DataTable = DataTables("股piao信息明细表")
    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("股piao信息明细表").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("股piao信息明细表").ResumeRedraw()
'e.Form.Close()
msgbox("导入结束")

 回到顶部
帅哥哟,离线,有人找我吗?
天一生水
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1137 积分:11230 威望:0 精华:0 注册:2017/9/26 16:30:00
  发帖心情 Post By:2020/5/6 16:54:00 [只看该作者]

谢谢蓝老师!
我测试如果选择覆盖导入时,速度会非常慢。
当表格为空时,如果用普通追加导入实例中三个txt文件,不到0.7秒,但是如果选择覆盖导入会耗时近5秒。是哪里的原因?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107135 积分:544918 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/5/6 17:10:00 [只看该作者]

没有办法,要增加判断,就多了一次循环和查找遍历。每一行都要查询是否有旧数据以覆盖。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107135 积分:544918 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/5/6 17:11:00 [只看该作者]

可以参考这里自己改进一下

 回到顶部
帅哥哟,离线,有人找我吗?
天一生水
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1137 积分:11230 威望:0 精华:0 注册:2017/9/26 16:30:00
  发帖心情 Post By:2020/5/12 12:08:00 [只看该作者]

蓝老师好!
如果导入通达信股piao软件生成的日线数据,会提示日期列为字符类型(附件中的SH600008),感觉文本文件不会记录下来字符串的格式~
怎样修改一下代码才能通用?
另外,老师提示参考http://www.foxtable.com/webhelp/topics/2225.htm  修改代码,不知道从哪里下手,请老师指教。
谢谢!

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



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107135 积分:544918 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/5/12 13:36:00 [只看该作者]

SH600008里面的数据是按tab键分隔的,不是空格

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



 回到顶部
帅哥哟,离线,有人找我吗?
天一生水
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1137 积分:11230 威望:0 精华:0 注册:2017/9/26 16:30:00
  发帖心情 Post By:2020/5/14 15:03:00 [只看该作者]

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

Dim cn As Integer = 0   '计算行数
Dim t As Table = Tables("股piao数据")
Dim codes As List (Of String) = DataTables("股piao数据").GetValues("代码","","时间")
Dim st As Date = Date.Now
For Each code As String In codes
    Dim drlist As List (Of DataRow) = DataTables("股piao数据").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
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107135 积分:544918 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/5/14 15:12:00 [只看该作者]

1/2、类似流水账的用法,参考:http://www.foxtable.com/webhelp/topics/2136.htm

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

 回到顶部