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

Keeping Data Columns by name and removing the others within a DataTable

我有一个包含 35 列以上的 csv 文件,然后使用我的 csv reader 将其放入数据 table 中,我想按名称查找 4 列,然后删除其余列, 4 列可能是随机索引,所以我想搜索 header.

的名称

到目前为止我有这个:

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 是我要保留的列的示例

这只是删除了第一列并显示一条错误消息 "Collection was modified"。

我想这样做,这样我就可以 sqlbulkcopy 数据table。

编辑

创建另一个数据 table 将 运行 内存不足

您不能在枚举集合时更改集合。您可以将代码更改为具有向后索引的标准 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"});