从一个DataTable复制特定列到另一个DataTable

21

我已经在DataTable中读取了一些数据(来自Excel文件),现在我想对其进行筛选,并将只包含特定列的数据复制到另一个表中!

DataTable格式:

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

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

如何使用 xxxx 复制 ColA-ColC 到新 DataTable 中?

谢谢

7个回答

50
您可以通过使用 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' 不属于基础表 - leon22
2
这意味着您的 DataTable 中不存在 xxx 列。 - Arshad
我认为问题在于DataTable的标题中有其他数据(一些数据),而所需的列位于下方。 xxx列肯定在表格中! - leon22
我认为这个答案是最好的,但不幸的是那个人选择了其他的。无论如何,阿什哈德的方法很好。 - ranjenanil
这对我来说不起作用,我不知道如何解决这个问题。 - user1298925

31

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

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);

2
我使用这个方法仅复制列,只需在执行copy()之后添加".clear()"语句即可。 - Enrico
如果我们有一大堆列,一个一个地删除它们会很麻烦。难道没有一种方法可以只复制我们需要的列吗? - Rami Zebian
1
@RamiZebian,你应该看一下以下答案:https://dev59.com/5mMl5IYBdhLWcg3wcmnD#18402444 - Giannis Paraskevopoulos
一个需要注意的问题是,计算列需要在使用该计算的列之后被删除。 - jo0ls
当你只有少量列需要删除时,使用remove或removeAt是合适的,但如果你有很多列并且只想保留其中几列,那么这种方法就不太适用了。那么如何做相反的操作呢?也就是说,如何只选择你想要的几列呢? - Willy
@Ralph,也许你想看一下Arshad的答案 https://dev59.com/5mMl5IYBdhLWcg3wcmnD#18402444 - Giannis Paraskevopoulos

3
请检查这个。
  foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
     }

上述示例假设两个表具有相同数量、类型和顺序的列。
这里是实际的链接

2

使用感兴趣的列定义您的复制 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)
            {
...

1
可以使用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; });

0

在vb.net中进行相同的修复

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


0
该方法接收一个数据表(TextFileTable)作为参数,并将TextFileTable的选定内容复制到tblFormat表中。在添加行语句中,列数必须与目标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;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接