本文へスキップ
BecomeCoder

C#実践コース · 第3章 ビルド・ツールとプロジェクト基礎 · レッスン21

CSVを扱う

ブラウザで完結

導入

Excelから出力された表データなど、**CSV(カンマ区切り値)**を読み書きする機会は頻繁にあります。単純なCSVなら標準ライブラリの文字列操作だけで扱えます。

図解

flowchart LR
    CSV["Name,Price<br/>マウス,2980<br/>キーボード,5980"] -->|行で分割 → カンマで分割| ROWS["各行を Product に変換"]

サンプル

string csv = """
Name,Price,Stock
マウス,2980,15
キーボード,5980,8
モニター,19800,3
""";

var lines = csv.Trim().Split('\n');
// 先頭行(ヘッダー)を除き、各行をカンマ分割して Product に変換
var products = lines.Skip(1)
    .Select(line => line.Split(','))
    .Select(cols => new Product(cols[0], int.Parse(cols[1]), int.Parse(cols[2])))
    .ToList();

foreach (var p in products.Where(p => p.Stock < 10))
    Console.WriteLine($"在庫僅少: {p.Name}(残り{p.Stock})");
// 在庫僅少: キーボード(残り8) / 在庫僅少: モニター(残り3)

record Product(string Name, int Price, int Stock);
  • 行はSplit('\n')、各行はSplit(',')で分割する
  • 先頭行はヘッダーなのでSkip(1)で飛ばす
  • 値の中にカンマや改行が含まれる複雑なCSVは、CsvHelperなどのNuGetを使うのが安全
  • Excel由来のCSVはShift-JISのことが多く、そのまま読むと文字化けする点にも注意

演習

string csv = """
Name,Price,Stock
マウス,2980,15
キーボード,5980,8
モニター,19800,3
ヘッドセット,8900,0
""";

// TODO: 在庫が1以上ある商品の Price 合計を "在庫あり合計: 37760円" と出力してください
___
  • 期待される出力: 在庫あり合計: 37760円
ヒント1を見る

パース後 Where(p => p.Stock > 0).Sum(p => p.Price)

ヒント2を見る

var products = csv.Trim().Split('\n').Skip(1).Select(l => l.Split(',')).Select(c => new Product(c[0], int.Parse(c[1]), int.Parse(c[2]))); Console.WriteLine($"在庫あり合計: {products.Where(p => p.Stock > 0).Sum(p => p.Price)}円"); record Product(string Name, int Price, int Stock);

まとめ

  • CSVはSplit('\n')Split(',')で素朴に扱える
  • ヘッダー行はSkip(1)で飛ばす
  • 複雑なCSVはCsvHelper、文字コード(Shift-JIS)にも注意

次回: コンパイル自体を条件分岐させる「プリプロセッサディレクティブ」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。