2017-10-26 1 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 할 수 있습니다.

편집

당신이 그것에 열거하는 동안 당신은 컬렉션을 변경할 수 없습니다 메모리

답변

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

같은 역 색인과 루프에 대한 표준 코드를 변경할 수 있습니다. 또한, 아래 설명에서 설명한 것처럼, & & 논리 연산자를 사용하여 보존하려는 네 가지 이름과 같은 이름이없는 모든 열을 제거해야합니다. || 논리적 연산자는 이름이 "cat"(또는 if 조건의 다른 항목)이 아니기 때문에 "Lion"열이 제거되므로 모든 열을 제거합니다.

DataView를 사용하여 필요한 열만 추출 할 수도 있지만 두 번째 데이터 테이블을 메모리에 필요로하는 단점이 있으며 데이터 세트가 정말 큰 경우 문제가 발생할 수 있습니다.

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! = "거북이"&& dc.ColumnName! = "Lion")'입니다. 나는 그 해결책을 가지고이 대답을 시도 할 것을 제안한다. – dbc

+0

@dbc는 많은 차이를 만들 것이라고는 생각하지 못했지만 효과가있었습니다. 감사합니다! –

관련 문제