【问题标题】:Keeping Data Columns by name and removing the others within a DataTable [duplicate]按名称保留数据列并删除数据表中的其他列[重复]
【发布时间】:2017-10-26 08:46:53
【问题描述】:

我有一个包含 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 数据表。

编辑

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

【问题讨论】:

    标签: c# datatable sqlbulkcopy


    【解决方案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"});
    

    【讨论】:

    • 谢谢,我在创建另一个 DataTable 时内存不足,而 dataTable.columns.remove(dataColumn) 只是从表中删除了所有列
    • @MaxHughes - 当然应该是&& 而不是||,即if(dataColumn.ColumnName != "Cat" && dataColumn.ColumnName != "Dog" && dc.ColumnName != "Turtle " && dc.ColumnName != "Lion")。我建议使用该修复程序尝试此答案。
    • @dbc 从没想过它会有很大的不同,但它奏效了,谢谢!
    猜你喜欢
    • 2019-09-16
    • 2020-09-29
    • 2012-07-18
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多