カンマ区切り値(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
は特殊なシナリオでより多くの制御を提供しますが、注意深いエラー処理とデリミタ管理が必要です。