解析数据表从平面表到规范化表

本文关键字:规范化 面表 平面 数据表 | 更新日期: 2023-09-27 17:51:20

我有B2B集成的需求,我将从数据集读取平面表并解析为规范化形式的数据表。

我将在数据表中有重复列样本数据

Invoice num     Amount    LineNum   Line Amout  Ledger
INV1            100       1         50          11101
INV1            100       2         50          25631 

行将与不同的发票重复

如何清晰地选择到新的数据表?使用ADO。净

我想把数据解析成以下格式

<<p> 头表/strong>
  Invoice num     Amount    
  INV1            100         

行表

  Invoice num  LineNum   Line Amout  Ledger
  INV1          1         50          11101
  INV1          2         50          25631 

问题:我不知道把上面的格式带过来最好的方法是什么?我看到了使用linq, DataTable, Views ?我正在寻找一个代码片段。

解析数据表从平面表到规范化表

好的,为了开始这个问题,我正在使用DataTable和定义如下的数据。根据需要更改名称和类型。

// I am building this table in code just for the purposes of this answer.
// If you already have your data table, ignore!
DataTable salesTable = new DataTable();
salesTable.Columns.Add("InvoiceNum", typeof(string));
salesTable.Columns.Add("Amount", typeof(decimal));
salesTable.Columns.Add("LineNum", typeof(int));
salesTable.Columns.Add("LineAmount", typeof(decimal));
salesTable.Columns.Add("Ledger", typeof(string));
// This is also just to populate data for the sample.
// Omit as you already have your data.
salesTable.Rows.Add("INV1", 100M, 1, 50M, "11101");
salesTable.Rows.Add("INV1", 100M, 1, 50M, "25631");

注意,我正在使用.Rows.Add的过载,它接受params object[]数组。我传入的值是它们应该填充的列的顺序和类型。下面的代码使用了相同的方法。

我要做的第一件事是为新的规范化格式定义表。首先是头表。

DataTable headerTable = new DataTable();
headerTable.Columns.Add("InvoiceNum", typeof(string));
headerTable.Columns.Add("Amount", typeof(decimal));

然后是行项表。

DataTable lineTable = new DataTable();
lineTable.Columns.Add("InvoiceNum", typeof(string));
lineTable.Columns.Add("LineNum", typeof(int));
lineTable.Columns.Add("LineAmount", typeof(decimal));
lineTable.Columns.Add("Ledger", typeof(string));

之后,我将使用LINQ根据发票编号对原始销售表进行分组。

var groupedData = from row in salesTable.AsEnumerable()
                  group row by row.Field<string>("InvoiceNum") into grp
                  select grp;

在此之后,只需遍历组并将数据添加到新表中。

foreach (var invoiceGroup in groupedData)
{
    string invoiceNumber = invoiceGroup.Key;
    decimal amount = invoiceGroup.First().Field<decimal>("Amount");
    headerTable.Rows.Add(invoiceNumber, amount);
    foreach (DataRow row in invoiceGroup)
    {
        lineTable.Rows.Add(
                invoiceNumber,
                row.Field<int>("LineNum"),
                row.Field<decimal>("LineAmount"),
                row.Field<string>("Ledger")
            );
    }
}

现在你有了你喜欢的规范化格式的数据。同样,更改相关的列名和数据类型以满足您的需要。