はじめに
本記事はC#用ライブラリの「Csv」を使い方をサンプルを交えて述べる記事です。
Csvとは
C#でCSVファイルを読み書きするためのライブラリです。かなり簡単に使えることが特徴です。
詳細はこちらを参照ください。
CSVを使ってみる
「Csv」を使うサンプルとして、以下のようなCSVデータ(ウェブページの閲覧ログのイメージ)において、ページごとのユニークユーザー数を算出してみます。
ユニークユーザー数とは重複を取り除いたユーザー数のことなので、例えば上記の製品紹介ページの場合は、ユニークユーザー数は2となります。(製品紹介ページのレコードは計5件ですが、内4件は同じユーザーID:5のユーザーなので、ユニークユーザー数としては2になります。)
では作り方を見ていきます。まずは「Csv」のインストールが必要です。VisualStudioでプロジェクトを作成し、プロジェクトを右クリックし、コンテキストメニューから「Nugetパッケージの管理」をクリックします。その後、「Csv」というNugetパッケージをインストールします。これでインストールは完了です。
次にコードを書いていきます。実際のコードは以下です。
using Csv;
// CSVファイルを文字列で取得
var csvText = File.ReadAllText("CSVファイルのパス");
// ページごとのユニークユーザーID一覧
var uniqueUserIdsPerPage = new Dictionary<string, HashSet<string>>();
// CSVファイルの各行ごとに処理をする
foreach (var line in CsvReader.ReadFromText(csvText))
{
// [ページ名]列の値を取得
var pageName = line["ページ名"];
// [ユーザーID]列の値を取得
var userId = line["ユーザーID"];
if (!uniqueUserIdsPerPage.ContainsKey(pageName))
{
// 該当のページに対応するユーザーIDが一件も追加されていない場合はユーザーIDリストを初期化
uniqueUserIdsPerPage.Add(pageName, new HashSet<string>() { userId });
}
else
{
// 該当のページに対応するユーザーIDを追加
// HashSetへの追加なので重複追加はされない
uniqueUserIdsPerPage[pageName].Add(userId);
}
}
// ページごとのユニークユーザー数を出力
foreach (var (pageName, users) in uniqueUserIdsPerPage)
{
Console.WriteLine($"{pageName}:{users.Count}");
}
コードの説明をしていきます。
CSVファイルの内容を文字列で取り出し、以下のforeach文でCSVの各行ごとに反復処理をします。
// CSVファイルの各行ごとに処理をする
foreach (var line in CsvReader.ReadFromText(csvText))
{
// 各行ごとにこの処理を実施
}
foreach内部ではまず、行ごとの[ページ名]列と[ユーザーID]列の値を取得します。
上記のコード内の変数line
は「Csv」で提供するインターフェースを実装しているため、以下のように列名を使ってインデクサアクセスをすることで、その列名に対応する列の値が取得できます。
// [ページ名]列の値を取得
var pageName = line["ページ名"];
// [ユーザーID]列の値を取得
var userId = line["ユーザーID"];
次に、取得したページ名ごとにユーザーIDの値をHashSetに詰めていきます。HashSetへの登録なので、重複したユーザーIDは登録されず、この方法でデータを登録していくことで、ページごとのユニークユーザーのIDリストが作成できます。
if (!uniqueUserIdsPerPage.ContainsKey(pageName))
{
// 該当のページに対応するユーザーIDが一件も追加されていない場合はユーザーIDリストを初期化
uniqueUserIdsPerPage.Add(pageName, new HashSet<string>() { userId });
}
else
{
// 該当のページに対応するユーザーIDを追加
// HashSetへの追加なので重複追加はされない
uniqueUserIdsPerPage[pageName].Add(userId);
}
foreachを抜けたのちに、登録した情報を使ってページ数ごとのユニークユーザーを出力します。
// ページごとのユニークユーザー数を出力
foreach (var (pageName, users) in uniqueUserIdsPerPage)
{
Console.WriteLine($"{pageName}:{users.Count}");
}
出力結果は以下のようになります。
使ってみて感じた「Csv」の良さは、とにかく手軽に使えることだと思います。Csvのテキストから各行ごとの反復処理がすぐに書けますし、列名を指定して値を取得できるのもかなり便利だと思いました。手軽にCsvを操作したいときに役立つライブラリだと思いました。
まとめ
本記事では、C#用ライブラリの「Csv」を使い方をサンプルを交えて述べました。
とにかく手軽に使えることが「Csv」の良さだと感じたので、サクッとCSVをC#で操作したいときには使ってみることをお勧めします。