C#

【C#】CSVファイルを読み込んでGroupByで加工して出力

C#でCSVを読み込んで、データを加工する方法をまとめます。

特定の列データでグループ化して平均値を求める…などのやり方になります。

CSVを読み込む準備

この記事では下記のCSVを例に使っていきます

CSVを読み込むにはCsvHelperを利用します。

こちらの記事で使い方などを書いています。

パッケージのインストール

PM> Install-Package CsvHelper

CSVを読み込み、加工して別ファイルに出力

①CsvHelperを使ってCSVを指定したパスから読み込み、ユーザ定義クラスにマッピングを行います。

⓶その後、LinqのGroupByでキーを指定して、平均値と合計値をSelectで射影します。

③最後にCSVを指定したパスに出力します。

using ConsoleApp4;
using CsvHelper;
using System.Globalization;
using System.Text;

var orgFileParh = @"C:\test\input\org.csv";
var outPutDirectory = @"C:\test\output\";

// .NET 6 の場合でShift-jisをエンコードする場合は下記の処理が必要
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

using (StreamReader reader = new(orgFileParh, Encoding.GetEncoding("shift-jis")))
{
    using (CsvReader csvReader = new(reader, new CultureInfo("ja-jp", false)))
    {
        // ①マッピング
        var rows = csvReader.GetRecords<Person>();
        
       // ⓶Teamごとの平均を求める
        var groups = rows.GroupBy(x => x.Team)
                          .Select(x => new 
                          {
                              Team = x.Key,
                              Average = x.Average(a => a.ForAverage),
                              Sum = x.Sum(a => a.ForSum),
                          });

        // ③新しいファイルに出力
        var outputFilePath = $"{outPutDirectory}output.csv";
        using (StreamWriter writer = new(outputFilePath, false, Encoding.GetEncoding("shift-jis")))
        {
            using (CsvWriter csvWriter = new(writer, new CultureInfo("ja-jp", false)))
            {
                csvWriter.WriteRecords(groups);
            }
        }
    }
}

出力されたCSVファイルを開いてみると、Teamごとに平均値と合計値がグループ化されて出力されていることが確認できました。

複数のキーを指定したい場合

GroupByのキーを複数指定したい場合は書き方が少し変わります。

// 複数のキーを指定する場合
var groupsMultiKey = rows.GroupBy(x => new { x.Team, x.Gender })
                  .Select(x => new
                  {
                      Team = x.Key.Team,
                      Gender = x.Key.Gender,
                      Average = x.Average(a => a.ForAverage),
                      Sum = x.Sum(a => a.ForSum),
                  });
エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい