我有一个包含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数据表。
修改
创建另一个数据表将耗尽内存
答案 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"});