У меня есть файл csv с 35 + столбцами, затем он помещается в таблицу данных, используя мой 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)
}
}
Кошка, собака, черепаха и лев - это примеры столбцов, которые я хочу сохранить
Это просто удаляет первый столбец и отображает сообщение об ошибке «Коллекция была изменена».
Я хочу сделать это, чтобы затем sqlbulkcopy получить данные.
РЕДАКТИРОВАТЬ
создание другой таблицы данных будет исчерпано
Вы не можете изменить коллекцию, пока вы перечисляете ее. Вы можете изменить свой код на стандарт для цикла с обратной индексацией, подобной этому
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"});