2016-09-01 15 views
3

さまざまな投稿を読んで、私が望む結果を得ることに近いと思うが、「合計」部分が間違った答えを出す。私は、私のcsvファイルには列見出しがないので、「合計」と呼ばれる方法が原因であると思われます。C#Groupby分割後の合計CSV(ヘッダーなし)

CSVファイルには、次のものが含まれています

222、1

223、2

222、1

224、2

222、-1

私はしたいもの

されています。ここではグループ

による最初の列で

  • をCSVファイルを読み込み、データを分割
  • グループ
  • 合計2列目には、私がやっていることですこれまで:

    var newquery = from line in File.ReadAllLines(path_source) //read all lines in csv file 
             let values = line.Split(',') //split the values by separator 
             let price_value = values[0]              
             group line by price_value into g       
             orderby g.Key 
             //select g; 
             select new 
             { 
              price_column = g.Key, 
              qty_column = g.Sum(x => x[1]) 
             }; 
    
    var writesum = newquery.Select(record => record.price_column + "," + record.qty_column); 
    
    File.WriteAllLines(path_target, writesum); 
    

    path_targetファイルには示しています

    222、45

    223、80

    224、65

    これはsplitgroupbyorderby構文が正しいですが、sumは完全に間違っていることを私に伝えます。

    sumの結果が間違っている理由の1つは、ここの構文qty_column = g.Sum(x => x[1])に起因すると考えられます。

    データにヘッダーが含まれていないため、例のようにx.somethingを呼び出すことができません。

    一方、私はこの時点で完全に間違っている可能性があります!

    ご協力いただきまして誠にありがとうございます。

答えて

3

まず第一に、グループそれらが分割された後の値ではなく、生の行:

group values by price_value into g 

代わりの

group line by price_value into g 

次はstringあなたは合計する前にintsとして合計する解析それら:

qty_column = g.Sum(x => int.Parse(x[1])) 

qty_column = g.Sum(x => x[1]) 

x[1]は、stringである。

さて結果は次のとおりです。

あなたを与える
var newquery = from line in File.ReadAllLines(path_source) //read all lines in csv file. 
         let values = line.Split(',') //split the values by separator 
         let price_value = values[0] 
         group values by price_value into g 
         orderby g.Key 
         //select g; 
         select new 
         { 
          price_column = g.Key, 
          qty_column = g.Sum(x => int.Parse(x[1])) 
         }; 

222、1

223、2

224、2

とにかく、流暢な構文が多少読みやすくなります!私の部分にhelp..youため

var v = new List<string> File.ReadAllLines(path_source) //read all lines in csv file. 
    .Select(x => x.Split(',')) 
    .Select(x => new { Key = x.First(), Value = x.Last() }) 
    .GroupBy(x => x.Key) 
    .Select(x => new 
    { 
     price_column = x.Key, 
     qty_column = x.Sum(y => int.Parse(y.Value)) 
    }); 
+0

おかげで私の検索の多くの時間を保存した.....初心者のミス私は怖いです!今日何かを学んだ!再度、感謝します。 – Lee

関連する問題