【问题标题】:Copy specific columns from one DataTable to another将特定列从一个 DataTable 复制到另一个
【发布时间】:2013-08-26 11:24:20
【问题描述】:

在 DataTable 中读取一些数据(来自 excel 文件),现在我想过滤它并仅将特定列复制到另一列!

数据表格式:

some data 
ColA|ColB|ColC
xxxx|xxxx|xxxx
some data

some data表示与ColA-ColC无关的其他表数据

如何将带有 xxxx 的 ColA-ColC 复制到新的 DataTable?

谢谢

【问题讨论】:

    标签: c# .net datatable


    【解决方案1】:

    您可以使用DataView.ToTable() 来简单地做到这一点:

    System.Data.DataView view = new System.Data.DataView(yourOriginalTable);
    System.Data.DataTable selected = 
            view.ToTable("Selected", false, "col1", "col2", "col6", "col7", "col3");
    

    【讨论】:

    • System.ArgumentException: 列 'xxx' 不属于基础表
    • 这意味着您的DataTable 中不存在xxx 列。
    • 我认为问题在于我在 DataTable 的标题中有其他数据(一些数据),并且所需的列在下面。 xxx 列肯定在表中!
    • 我认为这是其中一个很好的答案,但不幸的是,这家伙勾选了其他。任何方式都不错的方法 Arshad
    • 这对我不起作用,我不知道如何解决问题
    【解决方案2】:

    复制整个表格并删除不需要的列。

    DataTable copyDataTable;
    copyDataTable = table.Copy();
    copyDataTable.Columns.Remove("ColB");
    

    int columnIndex = 1;//this will remove the second column
    DataTable copyDataTable;
    copyDataTable = table.Copy();
    copyDataTable.Columns.RemoveAt(columnIndex);
    

    【讨论】:

    • 我用它来复制列,仅在执行 copy() 后添加“.clear()”语句。
    • 如果我们有大量的列怎么办。一个一个地删除它们会很麻烦。难道没有办法只复制我们需要的列吗?
    • @RamiZebian 你应该看看下面的答案stackoverflow.com/a/18402444/2401981
    • 一个问题是计算列需要在计算使用的列之后删除。
    • 使用 remove 或 removeAt 适用于列数较少的情况,但不适用于列数较多且只需要几列的情况。那么如何做相反的事情,我的意思是,只选择你想要的几列?
    【解决方案3】:

    请检查一下

      foreach (DataRow dr in dataTable1.Rows) {
        if (/* some condition */)
            dataTable2.Rows.Add(dr.ItemArray);
         }
    

    上面的例子假设两个表的列数、类型和顺序相同。

    这里是实际的link

    【讨论】:

      【解决方案4】:

      仅使用兴趣列定义您的副本 DataTable。您可以使用此示例代码循环源行的列并将值设置为目标行:

      public void IntegrateRow(DataRow p_RowCible, DataRow p_RowSource)
              {
                  try
                  {
                      foreach (DataColumn v_Column in p_RowCible.Table.Columns)
                      {
                          string ColumnName = v_Column.ColumnName;
                          if (p_RowSource.Table.Columns.Contains(ColumnName))
                          {
                              p_RowCible[ColumnName] = p_RowSource[ColumnName];
                          }
                      }
                  }
                  catch (Exception e)
                  {
      ...
      

      【讨论】:

        【解决方案5】:

        使用LINQ可以实现

        假设我们有两个DataTable。 1.dtSource 和 2.dtDestination

        如果dtDestination 没有行,则使用以下代码生成空白行。

        dtSource.AsEnumerable().All(row => { dtDestination.Rows.Add(); return true; });
        

        下面的代码会将特定的DataColumn 数据复制到另一个DataTableDataColumn。假设两个表的行数相同。

        int rowIdx = 0;
        dtDestination.AsEnumerable().All(row => { row["colName"] = dtSource.Rows[rowIdx++]["colName"]; return true; });
        

        【讨论】:

          【解决方案6】:

          此方法接收一个数据表(TextFileTable)作为参数,然后继续将TextFileTable的选定内容复制到tblFormat表中。在add row语句中列数,必须与目标ted表中的列数相匹配,即使这两个表可以是不同的大小。

          public DataTable CopyTable (DataTable TextFileTable)
                  {
                      DataTable tblFormat = new DataTable();
          
                          tblFormat.Columns.Add("ColumnA");
                          tblFormat.Columns.Add("ColumnB");
                          tblFormat.Columns.Add("ColumnC");
                          tblFormat.Columns.Add("ColumnD");
                          tblFormat.Columns.Add("ColumnE");
          
                          for (int i = 0; i < TextFileTable.Rows.Count; i++)
                          {
          
                              tblFormat.Rows.Add(new string[] { TextFileTable.Rows[i][0].ToString(), TextFileTable.Rows[i][1].ToString(),
                              TextFileTable.Rows[i][2].ToString(), TextFileTable.Rows[i][8].ToString(), TextFileTable.Rows[i][9].ToString() });
          
                          }
          
          
                      return tblFormat;
                  }
          

          【讨论】:

            【解决方案7】:

            vb.net 中的相同修复

            Dim view As DataView = New DataView(TB) Dim selected As DataTable = view.ToTable("Selected", False, "id", "col1", "col2")

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-06
              • 2011-06-21
              • 1970-01-01
              • 2012-01-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多