VB.NET - 根据共享值组合DataTable中的行

时间:2015-08-24 20:27:12

标签: vb.net datatable datarow spreadsheetgear

我正在尝试根据共享ID合并DataTable中的行。表数据如下所示:

Member | ID   | Assistant | Content
---------------------------------------------
16     | 1234 | jkaufman  | 1/1/2015 - stuff1
16     | 1234 | jkaufman  | 1/2/2015 - stuff2
16     | 4321 | mhatfield | 1/3/2015 - stuff3
16     | 4321 | mhatfield | 1/4/2015 - stuff4
16     | 4321 | mhatfield | 1/5/2015 - stuff5
16     | 5678 | psmith    | 1/6/2015 - stuff6

我想根据匹配的ID组合行。有两个步骤我可以使用一些澄清。第一个是合并行。第二个是组合内容列,以便内容不会丢失。对于上面的例子,这就是我想要的:

Member | ID   | Assistant | Content
-------------------------------------------------------------------------------------------
16     | 1234 | jkaufman  | 1/1/2015 - stuff1 \r\n 1/2/2015 - stuff2
16     | 4321 | mhatfield | 1/3/2015 - stuff3 \r\n 1/4/2015 - stuff4 \r\n 1/5/2015 - stuff5
16     | 5678 | psmith    | 1/6/2015 - stuff6

我的最终目标是将DataTable复制到Excel电子表格中,因此我不确定\r\n是否是正确的换行符,但这是我此时最不关心的问题。

这是我现在的代码(编辑:更新为当前代码):

Dim tmpRow As DataRow
dtFinal = dt.Clone()

Dim i As Integer = 0
While i < dt.Rows.Count
    tmpRow = dtFinal.NewRow()
    tmpRow.ItemArray = dt.Rows(i).ItemArray.Clone()
    Dim j As Integer = i + 1
    While j <= dt.Rows.Count
        If j = dt.Rows.Count Then 'if we've iterated off the end of the datset
            i = j
            Exit While
        End If
        If dt.Rows(i).Item("ID") = dt.Rows(j).Item("ID") Then 'if we've found another entry for this id
            'append change to tmpRow
            tmpRow.Item("Content") = tmpRow.Item("Content").ToString & Environment.NewLine & dt.Rows(j).Item("Content").ToString
        Else 'if we've run out of entries to combine
            i = j
            Exit While
        End If

        j += 1
    End While
    'add our combined row to the final result
    dtFinal.ImportRow(tmpRow)
End While

当我将最终表格导出到Excel时,电子表格是空白的,所以我肯定做错了。

任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:0)

我发现VB语法比C#中的语法笨重,但你可能更喜欢这个Linq和分组解决方案:

Dim merge = (From rw In dt.Rows.OfType(Of DataRow)()
            Group rw By
                New With {.fld1 = rw(0)}.fld1,
                New With {.fld2 = rw(1)}.fld2,
                New With {.fld3 = rw(2)}.fld3 Into Group).
                    Select(Function(x)
                               Return New With {.Member = x.fld1,
                                                .ID = x.fld2,
                                                .Assistant = x.fld3,
                                                .Content = String.Join("", x.Group.Select(Function(y)
                                                                                              Return String.Join("", y.ItemArray)
                                                                                          End Function))}
                           End Function)

enter image description here