解析数据表从平面表到规范化表
本文关键字:规范化 面表 平面 数据表 | 更新日期: 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")
);
}
}
现在你有了你喜欢的规范化格式的数据。同样,更改相关的列名和数据类型以满足您的需要。