按名称保留数据列并删除DataTable中的其他列

时间:2017-10-26 08:46:54

标签: c# datatable sqlbulkcopy

我有一个包含35+列的csv文件,然后使用我的csv阅读器将其放入数据表中,我希望按名称找到4列然后删除其余列,4列可以是随机索引所以我想要搜索标题的名称。

到目前为止,我有这个:

DataTable dataTable = new DataTable();
dataTable = CSVReader.CSVInput(filepath);

foreach(DataColumn dataColumn in dataTable.Columns)
{
    if(dataColumn.ColumnName != "Cat" || dataColumn.ColumnName != "Dog" || dc.ColumnName != "Turtle " || dc.ColumnName != "Lion")
    {
        dataTable.Columns.Remove(dataColumn)
    }
}

Cat,Dog,Turtle和lion是我想保留的列的例子

这只会删除第一列,并显示一条错误,说明"收集已被修改"。

我想这样做,然后我可以sqlbulkcopy数据表。

修改

创建另一个数据表将耗尽内存

1 个答案:

答案 0 :(得分:1)

您在枚举时无法更改集合。您可以使用像

这样的向后索引将代码更改为标准for循环
for(int x = dataTable.Columns.Count - 1; x >= 0; x--)
{
   DataColumn dc = dataTable.Columns[x];
   if(dc.ColumnName != "Cat" && dc.ColumnName != "Dog" && 
      dc.ColumnName != "Turtle " && dc.ColumnName != "Lion")
   {
       dc.Columns.Remove(dataColumn)
   }
}

当您从集合中删除项目时,需要反向循环以避免跳转列。另外,如下所述,您需要使用&&逻辑运算符,用于删除所有没有名称的列,例如要保留的四个列。使用||逻辑运算符将删除所有列,因为名为“Lion”的列将被删除,因为其名称不是“cat”(或if条件中的任何其他内容)。

还可以使用DataView仅提取您需要的列,但这样做的缺点是需要在内存中使用第二个数据表,如果您的数据集非常大,则可能会遇到问题。

DataTable datatable = CSVReader.CSVInput(filepath);
DataView dv = new DataView(datatable);
DataTable newTable = dv.ToTable(false, new string[] {"cat", "dog", "turtle", "lion"});