vb.net 中的数据表保留最右边的列中的数据并删除空列

datatable in vb.net keep rightmost column with data in and remove empty columns

我有一个数据表,其中包含我想要格式化的以下数据,并且只有最近几周的数据。

ID Name Week 1 Week 2 Week 3 Week 4
1 Conor 100 87 3 0
2 Frank 35 70 0 0
3 Jeff 35 13 0 57

我想保留前 2 列,然后保留最右边不是 0 的列,得到以下内容

ID Name Value
1 Conor 3
2 Frank 70
3 Jeff 57

我是 LINQ 的新手,所以我有点不确定是否可以这样做,因此我们将不胜感激。

附加信息:我忘了说我是在 UiPath(一种 RPA 工具)中创建解决方案的,因此尽管 VB 对于此实例,代码会更好 LINQ 更可取。

Linq 很酷,但工作代码更酷。 Linq 不一定更快。它在内部执行循环。

您在 GetDataTable 函数中的代码将从 Excel 中提取数据。我刚刚构建了一个数据表来匹配您的示例。

在按钮单击事件中,我创建了一个 table 来保存结果。外部循环遍历源 DataTable 中的每一行。内部 For 循环从 dtSource 中最右边的列开始,然后返回到第三列(索引 2)。注意 Step -1。这应该适用于任意数量的周列,因为我们使用 dtSource.Columns.Count - 1 一旦找到非零值,它就会将记录添加到 dtResult 并退出内部 For 继续下一个dtSource.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim dtSource = GetDataTable()
    Dim dtResult As New DataTable
    dtResult.Columns.Add("ID", GetType(Integer))
    dtResult.Columns.Add("Name", GetType(String))
    dtResult.Columns.Add("Value", GetType(Integer))
    For Each row As DataRow In dtSource.Rows
        For i = dtSource.Columns.Count - 1 To 2 Step -1
            If CInt(row(i)) <> 0 Then
                dtResult.Rows.Add({row("ID"), row("Name"), row(i)})
                Exit For
            End If
        Next
    Next
    DataGridView1.DataSource = dtResult
End Sub

Private Function GetDataTable() As DataTable
    Dim dt As New DataTable
    dt.Columns.Add("ID", GetType(Integer))
    dt.Columns.Add("Name", GetType(String))
    dt.Columns.Add("Week1", GetType(Integer))
    dt.Columns.Add("Week2", GetType(Integer))
    dt.Columns.Add("Week3", GetType(Integer))
    dt.Columns.Add("Week4", GetType(Integer))
    dt.Rows.Add({1, "Conor", 100, 87, 3, 0})
    dt.Rows.Add({2, "Frank", 35, 70, 0, 0})
    dt.Rows.Add({3, "Jeff", 35, 13, 0, 57})
    Return dt
End Function