C# Programming

C#による効率的なCSVファイル読み込みと配列への格納

Spread the love

カンマ区切り値(CSV)ファイルは、表形式データを保存するための広く普及している形式です。この記事では、CSVファイルを読み取り、その内容を配列に格納するための2つの効率的なC#メソッドを紹介します。StreamReaderクラスを使用した手動によるアプローチと、Microsoft.VisualBasic.FileIOライブラリのTextFieldParserクラスを利用した、より効率的なソリューションについて説明します。

目次

StreamReaderを使用したCSVファイルの読み取り

StreamReaderアプローチは、読み取りプロセスを詳細に制御でき、多様なCSV形式のカスタマイズを可能にします。ただし、デリミタとエラー状態の処理には、より多くの手動操作が必要です。


using System;
using System.IO;

public class CsvReaderStreamReader
{
    public static string[][] ReadCsv(string filePath)
    {
        string[][] data = new string[0][]; // 空の配列として初期化
        try
        {
            using (StreamReader reader = new StreamReader(filePath))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    string[] values = line.Split(',');
                    Array.Resize(ref data, data.Length + 1);
                    data[data.Length - 1] = values;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"CSVファイルの読み取りエラー: {ex.Message}");
        }
        return data;
    }

    public static void Main(string[] args)
    {
        string filePath = "data.csv";
        string[][] csvData = ReadCsv(filePath);

        if (csvData != null)
        {
            foreach (string[] row in csvData)
            {
                Console.WriteLine(string.Join(" ", row));
            }
        }
    }
}

この改良されたコードは、配列を動的にサイズ変更することで、任意の初期サイズ制限を回避します。また、より分かりやすいエラーメッセージのための文字列補間と、簡潔な出力のためのstring.Joinを使用しています。

TextFieldParserを使用したCSVファイルの読み取り

TextFieldParserは、特に引用符付きフィールドやカスタムデリミタを持つ複雑なファイルの場合、CSV解析を簡素化します。これらの複雑な点を自動的に処理します。


using Microsoft.VisualBasic.FileIO;
using System;

public class CsvReaderTextFieldParser
{
    public static string[][] ReadCsv(string filePath)
    {
        string[][] data = new string[0][];
        try
        {
            using (TextFieldParser parser = new TextFieldParser(filePath))
            {
                parser.TextFieldType = FieldType.Delimited;
                parser.SetDelimiters(",");

                while (!parser.EndOfData)
                {
                    string[] fields = parser.ReadFields();
                    Array.Resize(ref data, data.Length + 1);
                    data[data.Length - 1] = fields;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"CSVファイルの読み取りエラー: {ex.Message}");
        }
        return data;
    }

    public static void Main(string[] args)
    {
        string filePath = "data.csv";
        string[][] csvData = ReadCsv(filePath);

        if (csvData != null)
        {
            foreach (string[] row in csvData)
            {
                Console.WriteLine(string.Join(" ", row));
            }
        }
    }
}

このコードは、TextFieldParserを使用してCSV解析を効率的に処理します。プロジェクトにMicrosoft.VisualBasicアセンブリへの参照を追加することを忘れないでください。

メソッドの比較

どちらのメソッドも同じ結果を得られますが、TextFieldParserは、特に複雑なCSVファイルの場合、その堅牢性と使いやすさから一般的に推奨されます。StreamReaderは特殊なシナリオでより多くの制御を提供しますが、注意深いエラー処理とデリミタ管理が必要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です