从数据表中删除重复的行,但仅限于它们与字符串列表匹配

时间:2016-06-16 20:31:06

标签: vb.net datatable

这对我来说有点难以解释,但我有一个问题是删除重复(以一种独特的方式,因此阅读很多谷歌文档并没有帮助atm)。

让我展示一下我正在努力做的事情,以便更好地解释我的问题。

enter image description here 好的,我想得到每一行= textbox1.text或者在这种情况下...... \ joi \ al \ users。一旦我有这些行,我想将该行的列(8).value字符串抓取到列表中。

示例圈2.

然后遍历NOT = \ joi \ al \ users的每一行,并获取列(8).value。如果column(8).value与上一个列表中的任何值相同,则从数据表中删除整行。话虽如此,我想忽略= \ joi \ al \ users。

的任何行

添加了一个小型数据表,以便根据我的评论提供更好的示例。

Dim dt As New DataTable

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    dt.Columns.Add("File Path", GetType(String))
    dt.Columns.Add("Audit", GetType(String))

    dt.Rows.Add("\\joi\al\users", "1")
    dt.Rows.Add("\\joi\al\users", "2")
    dt.Rows.Add("\\joi\al\users", "3")
    dt.Rows.Add("\\joi\al\users", "4")
    dt.Rows.Add("\\joi\al\users\otherfolder0", "1")
    dt.Rows.Add("\\joi\al\users\otherfolder1", "x")
    dt.Rows.Add("\\joi\al\users\otherfolder2", "x")
    dt.Rows.Add("\\joi\al\users\otherfolder3", "1")
    dt.Rows.Add("\\joi\al\users\otherfolder4", "2")
    dt.Rows.Add("\\joi\al\users\otherfolder5", "3")
    dt.Rows.Add("\\joi\al\users\otherfolder6", "4")

    Dim bs1 As New BindingSource
    bs1 = New BindingSource(dt, "")
    DataGridView1.DataSource = bs1

    'Rows with column(FilePath) = "\\joi\al\users" keep, and make note of column(Audit) 1,2,3,4.
    'Iterate through the rest of the rows, and remove any row with column(Audit) 1,2,3,4.

    'In this example, the only rows that would be left would be...

    'dt.Rows.Add("\\joi\al\users", "1")
    'dt.Rows.Add("\\joi\al\users", "2")
    'dt.Rows.Add("\\joi\al\users", "3")
    'dt.Rows.Add("\\joi\al\users", "4")
    'dt.Rows.Add("\\joi\al\users\otherfolder1", "x")
    'dt.Rows.Add("\\joi\al\users\otherfolder2", "x")

End Sub

1 个答案:

答案 0 :(得分:1)

鉴于测试数据看起来有点像这样:

enter image description here

只有2个“FilePath”版本,但这并不重要,因为您排除了特定版本。 该文本来自哪里 - 文本框,语音输入或烧录布什 - 无关紧要。

有26个条目,5个被免除,所有免除都有“excelsior”或“foo”作为Audit项目。首先,一种逐步的版本;有些可以合并,如下所示:

Dim exempt = "This entry is exempt"

' get the exempt rows
Dim exemptRows = dtX.AsEnumerable.Where(Function(q) q.Field(Of String)(0) = exempt)

' select the Audit data in them
Dim dupeData = exemptRows.Select(Function(s) s.Field(Of String)("Audit")).ToList()

' get the rows that are NOT exempt AndAlso are contained in dupeData
Dim NonDupeRows = dtX.AsEnumerable.
            Where(Function(q) q.Field(Of String)(0) <> exempt AndAlso
                            dupeData.Contains(q.Field(Of String)("Audit")) = False).
                        ToList()
' add the exempt rows back  (dont like this - it reorders them)
NonDupeRows.AddRange(exemptRows.ToArray())
  ' create a table for your viewing pleasure
dgvF.DataSource = NonDupeRows.CopyToDataTable()

enter image description here

我没有检查每个单一条目,但是免除的条目在那里,并且列表中没有“excelsior”或“foo”项目;所以它看起来是正确的。我可能会在原始表中添加一个索引/ Id列,这可能会加速并阻止它们在结果中重新排序。如果有很多行,我也可以使用LookUp。

这是一个更短,可能更快的版本,有很多行。一个好处是它可以防止保留的行被重新排序:

' select the Audit data in the non exempt rows
Dim dupeData = dtX.AsEnumerable.Where(Function(z) z.Field(Of String)(0) = exempt).
            Select(Function(s) s.Field(Of String)("Audit")).
            ToLookup(Function(q) q)

' get rows which are exempt OrElse do not have dupe Audit data
Dim NonDupeTbl = dtX.AsEnumerable.
    Where(Function(z) (z.Field(Of String)(0) = exempt) OrElse
              dupeData.Contains(z.Field(Of String)("Audit")) = False).CopyToDataTable()

' create a table for your viewing pleasure
dgvF.DataSource = NonDupeTbl

在问题的编辑中使用新的样本数据,结果通过:

enter image description here