데이터 열을 이름으로 유지하고 DataTable 내에서 다른 열 제거

c# datatable sqlbulkcopy

문제

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

고양이, 개, 거북이, 사자가 내가 지키고 싶은 칼럼의 예입니다.

이렇게하면 첫 번째 열이 제거되고 "컬렉션이 수정되었습니다"라는 오류가 표시됩니다.

그래서 나는 datatable을 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)
   }
}

컬렉션에서 항목을 제거 할 때 열을 건너 뛰지 않으려면 역순으로 반복해야합니다. 또한, 아래 설명에서 설명한 것처럼 && 논리 연산자를 사용하여 보존하려는 네 가지 이름과 같은 이름이없는 모든 열을 제거해야합니다. || 논리적 연산자는 이름이 "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"});


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.