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
我有一个数据表,其中包含我想要格式化的以下数据,并且只有最近几周的数据。
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