以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  同列中不同行的差  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=158186)

--  作者:莫名的精彩
--  发布时间:2020/11/10 21:06:00
--  同列中不同行的差
第二列和第三列为原有数据,查找出第三列中行与行之间差相等的数据(行间隔相同),提取到第五列,相应的第二列提取到第四列,如图:

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


--  作者:有点蓝
--  发布时间:2020/11/10 21:24:00
--  
没看懂【第三列中行与行之间差相等的数据(行间隔相同)】是什么意思,以上面数据为例说明一下
--  作者:莫名的精彩
--  发布时间:2020/11/10 22:00:00
--  
第三列数据中有两组数据相减的差刚好是11,并且相隔的行数相同,即是12与23,11与22,然后提取出来,对应第二列中的数据也提取出来。
怎样通过代码查找出类似的数据,并提取出来。

--  作者:有点蓝
--  发布时间: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

--  作者:莫名的精彩
--  发布时间: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编辑过]

--  作者:莫名的精彩
--  发布时间:2020/11/12 14:51:00
--  
应该怎么改
--  作者:有点蓝
--  发布时间: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

--  作者:莫名的精彩
--  发布时间:2020/11/12 20:17:00
--  
谢谢,原来是原数据为字符串不行,改为整数了就行了。
--  作者:莫名的精彩
--  发布时间: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

--  作者:有点蓝
--  发布时间: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