按名称保留数据列并删除 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"});
我有一个包含 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"});