0

我的问题是如何(有效地)将 DataTable 中的数据从一种状态转换为另一种状态。让我给你看一个例子:

源数据 - 一行中的一个文档

Invoice|Date    |User |LineNo|Article|Qty   |LineNo|Article|Qty  |LineNo|Article|Qty
190201 |20130110|User1|01    |Art1   |12 PCE|02    |Art2   |7 PCE|03    |Art3   |4 PCE

目标数据 - 多行中的一个文档,具体取决于每个文档中有多少行。标题数据(发票、数据和用户)在每一行中重复。

Invoice|Date    |User |LineNo|Article|Qty
190201 |20130110|User1|01    |Art1   |12 PCE
190201 |20130110|User1|02    |Art2   |7 PCE
190201 |20130110|User1|03    |Art3   |4 PCE

目标是将每文档一行的 DataTable 转换为多行 DataTable。你有什么建议吗?

4

1 回答 1

1

根据这些信息,我会看这样的东西:

您有一个预定义的 SourceDataTable,其中一行存在于 2 个部分中:

静态部分

发票 | 日期 | 用户

可以发生 N 次的动态部分。

线号 | 文章 | 数量

这使得以下序列: 静态 | 动态1 | 动态2 | 动态3 | 动态...

在此之后,我们知道如何计算动态行的数量。

var AmountOfNewLines = (SourceDataTable.Columns.Count - 3) / 3;

//the minus comes from the Static data
//divide by 3 because every Dynamic part exists out of 3 columns

基于此,您知道需要创建多少行,并且您知道您的格式如何:

//Creation of the DestinationTable datatable
var DestinationTable = new DataTable("Destination");

DestinationTable.Columns.Add("Invoice", typeof(String)); //Correct Type?
DestinationTable.Columns.Add("Date", typeof(String));
DestinationTable.Columns.Add("User", typeof(String));
DestinationTable.Columns.Add("LineNo", typeof(String));
DestinationTable.Columns.Add("Article", typeof(String));
DestinationTable.Columns.Add("Qty", typeof(String));

for(int i = 0; i < AmountOfNewLines - 1; i++)
{
  //Create a new row
  //Invoice|Date    |User |LineNo|Article|Qty
  foreach(DataRow d in SourceDataTable)
  {
    //Using the foreach makes the datarow more easier to approach
    //The Number inside the brackets explains which column is being approached.
    DestinationTable.Rows.Add(d[0], d[1], d[2], d[3+(3*i)], d[4+(3*i)], d[5+(3*i)])
  }

}
于 2013-11-06T14:47:36.537 回答