2017-02-06 8 views
4

私は、次の形式でExcelシートからデータを読んでいます -ラムダ式のアンピボットのDataTable

enter image description here

と私は次のway-

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を使用してデータをピボット解除することをお勧めします。 –

+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'の定義が含まれていません。 .. "エラー。 –