CSVファイルからStudentインスタンスを生成するサンプル

この記事の目的

  • CSV(カンマ区切りテキスト)形式のファイルからデータを読み取り、
  • C# のクラスインスタンスにマッピングする手順を学ぶ
  • 読み取ったインスタンスをコンソールに出力する

前提

  • .NET 6.0 以降が動作する環境
  • Visual Studio 2022 などでコンソールアプリケーションを作成できること
  • 実行フォルダに「data.csv」を配置していること

サンプルデータ(data.csv)

1,佐藤,170
2,鈴木,165
3,高橋,180
  • 項目順:ID, 名前, 身長(cm)
  • 行数:3 行

1. Student クラスの定義

/// <summary>
/// 学生情報を表すクラス
/// </summary>
public class Student
{
    public int Id { get; }
    public string Name { get; }
    public int Height { get; }

    public Student(int id, string name, int height)
    {
        Id     = id;
        Name   = name;
        Height = height;
    }

    public override string ToString()
    {
        return $"ID={Id}, 名前={Name}, 身長={Height}cm";
    }
}

2. CSVファイルの読み込みとパース

以下の手順で CSV を読み込み、List<Student> を作成します。

  1. File.ReadAllLines で全行を取得
  2. string.Split(',’) でフィールドに分割
  3. int.TryParse で ID と身長を数値変換
  4. new Student(…) でインスタンス化し、リストに追加
using System;
using System.Collections.Generic;
using System.IO;

class Program
{
    static void Main()
    {
        const string filePath = "data.csv";
        var students = new List<Student>();

        try
        {
            var lines = File.ReadAllLines(filePath);

            foreach (var line in lines)
            {
                var parts = line.Split(',');

                if (parts.Length != 3)
                {
                    Console.WriteLine($"警告: 不正な行をスキップ → \"{line}\"");
                    continue;
                }

                if (int.TryParse(parts[0], out int id)
                    && int.TryParse(parts[2], out int height))
                {
                    string name = parts[1];
                    var student = new Student(id, name, height);
                    students.Add(student);
                }
                else
                {
                    Console.WriteLine($"警告: 数値変換に失敗 → \"{line}\"");
                }
            }

            Console.WriteLine("=== 読み込んだ学生情報 ===");
            foreach (var s in students)
            {
                Console.WriteLine(s);
            }
        }
        catch (IOException ex)
        {
            Console.WriteLine($"ファイル読み込みエラー: {ex.Message}");
        }
    }
}
using System;
using System.Collections.Generic;
using System.IO;

class Program
{
    static void Main()
    {
        const string filePath = "data.csv";
        var students = new List<Student>();

        var lines = File.ReadAllLines(filePath);

        foreach (var line in lines)
        {
            var parts = line.Split(',');

            int id = int.Parse(parts[0]);
            string name = parts[1];
            int height = int.Parse(parts[2]);
            var student = new Student(id, name, height);

            students.Add(student);
        }

        Console.WriteLine("=== 読み込んだ学生情報 ===");

        foreach (var s in students)
        {
            Console.WriteLine(s);
        }
    }
}

internal class Student
{
    public Student(int id, string name, int height)
    {
        Id = id;
        Name = name;
        Height = height;
    }

    public int Id { get; }
    public string Name { get; }
    public int Height { get; }

    public override string ToString()
    {
        return $"ID={Id}, 名前={Name}, 身長={Height}cm";
    }
}

3. コード解説

  • File.ReadAllLines:ファイルを全行取得し string[] で返す
  • Split(’,’):カンマ区切りでフィールド分割
  • TryParse:ID・身長を安全に数値変換
  • エラーチェック:要素数チェックとパース失敗時の警告表示
  • 例外処理:I/O エラーをキャッチしてメッセージ表示

4. 実行結果イメージ

=== 読み込んだ学生情報 ===
ID=1, 名前=佐藤, 身長=170cm
ID=2, 名前=鈴木, 身長=165cm
ID=3, 名前=高橋, 身長=180cm

まとめ

CSV ファイルの読み込みとクラスインスタンス生成は、業務アプリケーションでよく使われる基本パターンです。本サンプルを基に、以下のような応用にも挑戦してみてください。

  • 区切り文字を変更(タブやセミコロンなど)
  • 大規模データ向けに File.ReadLines を利用
  • 複雑な CSV は外部ライブラリ(CsvHelper など)を導入して効率化

この流れを身につけて、より堅牢で拡張性の高いファイル I/O を実現しましょう。

訪問数 3 回, 今日の訪問数 3回

C#,File

Posted by hidepon