2017-10-26 4 views
0

35個以上の列を持つcsvファイルを持っていて、csvリーダーを使用してデータテーブルに配置され、残りの列を4列見つけます、4つの列がランダムなインデックスになる可能性がありますので、ヘッダーの名前を検索します。DataTable内のデータ列を名前で保持して削除する

は、これまでのところ私はこれを持っている:

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) 
    } 
} 

猫、犬、カメとライオンは私が

を維持したい列の例はこれがちょうど最初の列を削除し、というエラーを表示します"コレクションが変更されました"。

私はこのようにしたいので、私はdatatableをsqlbulkcopyすることができます。別のデータテーブルを作成する

EDIT

は、あなたがそれの上に列挙されている間は、コレクションを変更することはできませんメモリ

答えて

1

の外に実行されます。あなたは逆にループを使用すると、コレクションから項目を削除すると、列をジャンプ回避するために必要され、この

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) 
    } 
} 

のように後方のインデックスとループのための標準にあなたのコードを変更することができます。また、説明したように、以下のコメントでは、保存する4つの名前のような名前のないすべての列を削除するには、論理演算子& &を使用する必要があります。 ||を使う"Lion"という名前の列が "cat"(またはif条件の他のもの)でないため、論理演算子はすべての列を削除します。

必要な列のみを抽出するためにDataViewを使用する可能性もありますが、これはメモリ内に2番目のデータテーブルが必要であるという欠点があり、データセットが本当に大きい場合に問題が発生する可能性があります。

DataTable datatable = CSVReader.CSVInput(filepath); 
DataView dv = new DataView(datatable); 
DataTable newTable = dv.ToTable(false, new string[] {"cat", "dog", "turtle", "lion"}); 
+0

おかげで、私は別のDataTableを作成し、メモリを使い果たし、そしてdataTable.columns.remove(DataColumnのは)ちょうど –

+0

@MaxHughesテーブルからすべての列を削除する - 確かにそれはあるべき '&&'ない '' ||つまり、if(dataColumn.ColumnName!= "Cat" && dataColumn.ColumnName!= "Dog" && dc.ColumnName!= "Turtle" && dc.ColumnName!= "Lion") 'のようになります。私はその解決策でこの答えを試すことをお勧めします。 – dbc

+0

@dbcはそれほど大きな違いはないと思いましたが、うまくいきました。ありがとう! –

関連する問題