Foxtable(狐表)用户栏目专家坐堂 → 同列中不同行的差


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

主题:同列中不同行的差

帅哥哟,离线,有人找我吗?
莫名的精彩
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:19 积分:224 威望:0 精华:0 注册:2020/10/27 7:52:00
同列中不同行的差  发帖心情 Post By:2020/11/10 21:06:00 [只看该作者]

第二列和第三列为原有数据,查找出第三列中行与行之间差相等的数据(行间隔相同),提取到第五列,相应的第二列提取到第四列,如图:

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


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


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

没看懂【第三列中行与行之间差相等的数据(行间隔相同)】是什么意思,以上面数据为例说明一下

 回到顶部
帅哥哟,离线,有人找我吗?
莫名的精彩
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:19 积分:224 威望:0 精华:0 注册:2020/10/27 7:52:00
  发帖心情 Post By:2020/11/10 22:00:00 [只看该作者]

第三列数据中有两组数据相减的差刚好是11,并且相隔的行数相同,即是12与23,11与22,然后提取出来,对应第二列中的数据也提取出来。
怎样通过代码查找出类似的数据,并提取出来。

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


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

Dim t As Table = Tables("表A")
Dim c As Integer = t.Rows.Count - 1
Dim dict As new Dictionary(of Integer,List(of Integer))
Dim idx As Integer = 0
For i As Integer = 1 To c
    dict.Clear
    For k As Integer = 0 To c
        If k + i < c
            Dim d As Integer = t.Rows(k+i)("第三列") - t.Rows(k)("第三列")
            If d > 0
                If dict.ContainsKey(d) Then
                    dict(d).add(k)
                    dict(d).add(k+i)
                Else
                    Dim lst As new List(of Integer)
                    lst.add(k)
                    lst.add(k+i)
                    dict.Add(d,lst)
                End If
            End If
        End If
    Next
    For Each key As Integer In dict.Keys
        If dict(key).count > 2 Then
            Output.Show(key & "-----")
            For Each m As Integer In dict(key)
                Output.Show(m)
                Dim r As Row = t.Rows(idx)
                Dim r2 As Row = t.Rows(m)
                r("第四列") = r2("第二列")
                r("第五列") = r2("第三列")
                idx += 1
            Next
        End If
    Next
Next

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


加好友 发短信
等级:婴狐 帖子:19 积分:224 威望:0 精华:0 注册:2020/10/27 7:52:00
  发帖心情 Post By:2020/11/11 21:14:00 [只看该作者]

原来的减号改为加号为什么不行?


Dim t As Table = Tables("表A")

Dim c As Integer = t.Rows.Count - 1

Dim dict As new Dictionary(of Integer,List(of Integer))

Dim idx As Integer = 0

For i As Integer = 1 To c

    dict.Clear

    For k As Integer = 0 To c

        If k + ic

            Dim d As Integer = t.Rows(k+i)("第三列") + t.Rows(k)("第三列") '为什么改为加号就不行呢?

            If d > 0

                If dict.ContainsKey(d) Then

                    dict(d).add(k)

                    dict(d).add(k+i)

                Else

                    Dim lst As new List(of Integer)

                    lst.add(k)

                    lst.add(k+i)

                    dict.Add(d,lst)

                End If

            End If

        End If

  Next

    For Each key As Integer In dict.Keys

        If dict(key).count > 2 Then

           Output.Show("= " & key  )

            For Each m As Integer In dict(key)

             '   Output.Show(m)

       Dim r As Row = Tables("表b").AddNew()    

    ' r  = t.Rows(idx)

 'Dim r As Row  = t.Rows(idx)

                Dim r2 As Row = t.Rows(m)

                r("第四列") = r2("第二列")

                r("第五列") = r2("第三列")

                idx += 1

            Next

        End If

    Next

Next

[此贴子已经被作者于2020/11/12 14:49:06编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
莫名的精彩
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:19 积分:224 威望:0 精华:0 注册:2020/10/27 7:52:00
  发帖心情 Post By:2020/11/12 14:51:00 [只看该作者]

应该怎么改

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


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

我测试没有问题。

我大概解释一下算法,如果看得懂自行学习一下,如果看不懂,我也没办法了,
Dim t As Table = Tables("表A")
Dim c As Integer = t.Rows.Count - 1
Dim dict As new Dictionary(of Integer,List(of Integer))
Dim idx As Integer = 0
For i As Integer = 1 To c 按间隔遍历,比如间隔1,就是第2行减第1行、第3行减第2行...;比如比如间隔2,就是第3行减第1行、第4行减第2行...;以此类推
    dict.Clear
    For k As Integer = 0 To c '从第一行开始遍历每种间隔的差值
        If k + i < c ‘k+i就是间隔的行,比如间隔i=2,k=0的时候表示第一行,那么k+i=0+2=2就表示是第3行。。。
            Dim d As Integer = t.Rows(k+i)("第三列") - t.Rows(k)("第三列") ’按上面的说法,间隔i=2,k=0的时候,这一句就表示第3行第三列减去第1行第三列的值,
            If d > 0如果差值大于0
                If dict.ContainsKey(d) Then 如果已经记录过这个差值,添加到字典集合中
                    dict(d).add(k)
                    dict(d).add(k+i)
                Else
                    Dim lst As new List(of Integer) 如果没有记录过这个差值,新增集合添加到字典中
                    lst.add(k)
                    lst.add(k+i)
                    dict.Add(d,lst)
                End If
            End If
        End If
    Next
一种间隔遍历完毕
    For Each key As Integer In dict.Keys
        If dict(key).count > 2 Then 判断这个间隔的行中是否有超过2行的差值是一样的
            Output.Show(key & "-----")
            For Each m As Integer In dict(key) 
                Output.Show(m) 如果有超过2行的差值是一样的,显示这些行的行号
                Dim r As Row = t.Rows(idx)
                Dim r2 As Row = t.Rows(m)
                r("第四列") = r2("第二列")
                r("第五列") = r2("第三列")
                idx += 1
            Next
        End If
    Next
Next

 回到顶部
帅哥哟,离线,有人找我吗?
莫名的精彩
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:19 积分:224 威望:0 精华:0 注册:2020/10/27 7:52:00
  发帖心情 Post By:2020/11/12 20:17:00 [只看该作者]

谢谢,原来是原数据为字符串不行,改为整数了就行了。

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


加好友 发短信
等级:婴狐 帖子:19 积分:224 威望:0 精华:0 注册:2020/10/27 7:52:00
  发帖心情 Post By:2020/11/12 22:57:00 [只看该作者]

修改的是红色部分,把两个数相加改为三个数相加,但找不到相隔一行的数据(相隔一行有符合的数据),结果是从相隔两行开始找。
Dim t As Table = Tables("表A")

Dim c As Integer = t.Rows.Count - 1

Dim dict As new Dictionary(of Integer,List(of Integer))

Dim idx As Integer = 0

For i As Integer = 1 To c
    For p As Integer = 1 To c
        dict.Clear
        
        For k As Integer = 0 To c
            
            If k + i + p <= c
                
                Dim d As Integer = t.Rows(k+i+p)("第三列") + t.Rows(k+i)("第三列") + t.Rows(k)("第三列")  '改为三个数相加,相隔一行的数据找不出。
                
                If d > 0
                    
                    If dict.ContainsKey(d) Then
                        
                        dict(d).add(k)
                        dict(d).add(k+i)
                        dict(d).add(k+i+p)
                        
                    Else
                        
                        Dim lst As new List(of Integer)
                        
                        lst.add(k)
                        lst.add(k+i)
                        lst.add(i+k+p)
                        
                        dict.Add(d,lst)
                        
                    End If
                    
                End If
                
            End If
            
        Next
        
        For Each key As Integer In dict.Keys
            
            If dict(key).count > 3 Then
                
                Output.Show("= " & key  )
                
                For Each m As Integer In dict(key)
                    
                    Output.Show(m)
                    
                    Dim r As Row = Tables("表b").AddNew()
                    
                    ' r  = t.Rows(idx)
                    
                    'Dim r As Row  = t.Rows(idx)
                    
                    Dim r2 As Row = t.Rows(m)
                    
                    r("第四列") = r2("第二列")
                    
                    r("第五列") = r2("第三列")
                    
                    idx += 1
                    
                Next
            End If
        Next
    Next
Next

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


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

试试

Dim t As Table = Tables("表A")

Dim c As Integer = t.Rows.Count - 1

Dim dict As new Dictionary(of Integer,List(of Integer))

Dim idx As Integer = 0

For i As Integer = 1 To c
        dict.Clear
        
        For k As Integer = 0 To c
            
            If k + i + i <= c
                
                Dim d As Integer = t.Rows(k+i+i)("第三列") + t.Rows(k+i)("第三列") + t.Rows(k)("第三列")  '改为三个数相加,相隔一行的数据找不出。
                
                If d > 0

 回到顶部
总数 17 1 2 下一页