2017-02-06 1 views
4

나는 다음과 같은 형식으로 엑셀 시트에서 데이터를 읽고 있습니다 -람다 식 Unpivoting DataTable을

enter image description here

나는 다음과 같은 방법 -

enter image description here

에 데이터를 저장해야

나는 Linq 람다 표현의 도움으로 그것을하려하지만 나는 이것으로 어디에도 가지 않을 것이라고 생각한다.

private static readonly string[] designationNames = {"PA","A","SA","M","SM","CON"}; 
void Function() 
{ 
    /* ... */ 
    var resultSet = dt.AsEnumerable().Where(x => !String.IsNullOrEmpty(x.Field<String>("Project_Code"))) 
      .Select(x => 
       new 
       { 
        Month = x.Field<String>("Month"), 
        ProjectCode = x.Field<String>("Project_Code"), 
        Designations = designationNames.ToDictionary(d => d, d => x.Field<int>(d)) 
       } 
      ); 
} 

이 정규화 된 버전은 다음과 같습니다

 DataTable dataTable= ReadExcel(); 
     var dt = dataTable.AsEnumerable(); 

     var resultSet = dt.Where(x => !String.IsNullOrEmpty(x.Field<String>("Project_Code"))) 
         .GroupBy(x => 
            new 
            { 
             Month = x.Field<String>("Month"), 
             ProjectCode = x.Field<String>("Project_Code"), 
             //change designation columns into row data and then group on it 
             //Designation = 
            } 
           ); 
         //.Select(p => 
         //   new 
         //   { 
         //    Month= p.d 
         //   } 
         //  );` 
+0

Power Query를 사용하여 데이터를 unpivot하는 것이 좋습니다 - 훨씬 쉽게! –

+0

안녕하세요. 나는 우리가 람다 표현의 도움으로 그것을 할 수 있는지 궁금해하고있었습니다. Power Query는 먼저 탐색해야 할 것입니다. –

답변

2

내가 지정 이름의 미리 정의 된 세트 ToDictionary 사용합니다 - 내가 뭘하려

. 당신이 원하는 경우 평면 대신, 사용 유형이 아닌

private static readonly string[] designationNames = {"PA","A","SA","M","SM","CON"}; 

void Function() 
{ 
    /* ... */ 
    var resultSet = dt.AsEnumerable().Where(x => !String.IsNullOrEmpty(x.Field<String>("Project_Code"))) 
     .Select(x => 
      designationNames.Select(
       d => 
        new 
        { 
         Month = x.Field<String>("Month"), 
         ProjectCode = x.Field<String>("Project_Code"), 
         Designation = d, 
         Count = x.Field<int>(d) 
        } 
      ) 
     ).SelectMany(x => x).ToList(); 
} 

경우 항상 당신이 대신 x.Field<String>(d)를 사용하여 유효성을 검사 할 수 있습니다 int입니다.

+0

매력처럼 작동했습니다! :) –

+0

데이터 테이블에 AsEnumerable()을 추가해야했기 때문에 'var resultSet = dt.AsEnumerable(). Where ...'가 아니라면 'Datatable'에 'Where'의 정의가 없습니다. .. "오류가 발생했습니다. –