【问题标题】:Combining two c# datatables into one将两个 c# 数据表合二为一
【发布时间】:2016-02-06 05:02:32
【问题描述】:

我的 ASP.NET 应用程序中有两个由 csv 文件填充的数据表,我正在尝试将两者合二为一。

界面如下:

当我单击“合并数据”按钮时,它应该合并 test1.csv 和 test2.csv 哪种有效,但看起来像这样:

所以我的问题是如何对齐这两个数据表,以便所有数据都在同一行上?

以下是合并数据按钮的代码:

        List<string> filepaths = new List<string>();
        List<DataTable> allTables = new List<DataTable>();
        DataTable mergedTables = new DataTable();
        int rowCount = grdFiles.Rows.Count;

        for (int i = 0; i < rowCount; i++)
        {
            string filename = grdFiles.Rows[i].Cells[0].Text;
            filepaths.Add(Server.MapPath("~/Uploads/") + filename);
        }

        foreach(string path in filepaths)
        {
            DataTable dt = new DataTable();
            //converts csv into datatable
            dt = GetDataTableFromCsv(path, true);
            //add table to list of tables
            allTables.Add(dt);
        }

        foreach(DataTable datatable in allTables)
        {   
            //Merge each table in the list to the mergedTables datatable
            mergedTables.Merge(datatable);
        }
        csvUploadResults.DataSource = mergedTables;
        csvUploadResults.DataBind();

提前感谢您的帮助:)

【问题讨论】:

  • 两个表是否都与某个唯一键相关?
  • 不,表中的数据是相关的,但不共享键。
  • 那你打算如何进行合并?你怎么知道如何将 test1 中的一行连接到 test2 中的一行?
  • mergedTables 被填满了吗?
  • mergedTables.Merge(datatable);在最后一个 foreach 块中

标签: c# asp.net datatable


【解决方案1】:

您将需要数据表和merge them together 上的唯一键。您可以将 SchoolName 添加到您的第二个数据表并合并邮政编码上的两个表。或者更优选的是,在两个数据表中添加一个 id,并在 id 上合并两个数据表。

【讨论】:

  • 我不知道这两个数据表需要一个公共列才能正确合并。你知道有什么资源可以告诉你这是如何做到的吗?
  • 如果您能提供一些有关数据表来源的信息,我可以为您搜索解决方案。您是否在 C# 代码中创建了数据表?它们是否来自 SQL 选择查询?我不知道。
  • 这个问题还有另一个非常便宜的解决方案,你可以add an id to both tables after they are created 并将它们合并到那个id上。
  • 它们是从上传的 csv 文件创建的。问题中显示的“GetDataTableFromCsv”方法然后从 csv 数据创建数据表
  • 我在数据集中添加了一个 ID 列(见编辑)。我现在的问题是如何根据这些 id 进行合并?
【解决方案2】:

如果您的目标只是合并数据而不考虑两个数据之间的关系,那么您可以将另外两列添加到第一个数据表中,并通过循环从第二个表中获取数据并将它们分配给第一个数据表列。接收数据的方式将是数据将保存在第一个数据表中的方式。

public DataTable MergeData(DataTable dtFirst,DataTable dtSecond)
{
    dtFirst.Columns.Add("LocalAuthority");
    dtFirst.Columns.Add("AverageSpeed");
    for (int i = 0; i < dtFirst.Rows.Count; i++)
    {
        dtFirst.Rows[i]["LocalAuthority"] = dtSecond.Rows[i]["LocalAuthority"];
        dtFirst.Rows[i]["AverageSpeed"] = dtSecond.Rows[i]["AverageSpeed"];
    }
    return dtFirst;
}

现在,您需要在以下方法中将数据表作为参数传递。

MergeData(allTables.ElementAt(0), allTables.ElementAt(1));

【讨论】:

  • 完美运行,美观又简单,正是我想要的。谢谢:)
  • 非常简洁的解释。 =) +10
  • 但应该说,在 DBMS 中,行没有顺序,即使结果看起来正确,依赖基本上随机的检索索引也是错误的。
猜你喜欢
  • 2014-09-04
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多