導入
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)にも注意
次回: コンパイル自体を条件分岐させる「プリプロセッサディレクティブ」です。