CSVファイルは、データを保存や交換するための一般的な形式です。C#でプログラミングをしていると、CSVファイルを扱う機会は多いでしょう。特に、大きなCSVファイルを処理する場合、メモリ効率を考えて1行ずつ読み込む方法が重要になります。この記事では、C#でCSVファイルを1行ずつ読み込む方法について、初心者の方にも分かりやすく解説します。
CSVファイルを1行ずつ読み込む基本的な方法
C#でCSVファイルを1行ずつ読み込むには、System.IO
名前空間のStreamReader
クラスを使用します。以下に、基本的な読み込み方法を示すコード例を見てみましょう。
using System;
using System.IO;
class CsvReadExample
{
static void Main()
{
string filePath = "sample.csv"; // CSVファイルのパス
try
{
using (StreamReader reader = new StreamReader(filePath))
{
string line;
int lineNumber = 0;
// ファイルの終わりまで1行ずつ読み込む
while ((line = reader.ReadLine()) != null)
{
lineNumber++;
Console.WriteLine($"行 {lineNumber}: {line}");
// ここで各行の処理を行う
string[] values = line.Split(',');
foreach (string value in values)
{
Console.Write($"[{value.Trim()}] ");
}
Console.WriteLine();
}
}
}
catch (IOException e)
{
Console.WriteLine($"ファイルの読み込み中にエラーが発生しました: {e.Message}");
}
}
}
このコードでは、以下の手順でCSVファイルを読み込んでいます:
StreamReader
オブジェクトを作成し、CSVファイルを開きます。while
ループを使用して、ファイルの終わりまで1行ずつ読み込みます。- 各行を
Split
メソッドでカンマ区切りで分割し、個々の値を取得します。 - 読み込んだデータを表示します(実際の処理はここで行います)。
注意点とTips
- エンコーディング: 日本語を含むCSVファイルを読み込む場合は、適切なエンコーディングを指定する必要があります。
using (StreamReader reader = new StreamReader(filePath, System.Text.Encoding.GetEncoding("shift_jis")))
2.ヘッダー行の処理: 多くのCSVファイルは1行目にヘッダーがあります。必要に応じて最初の行を別途処理しましょう。
string headerLine = reader.ReadLine(); // ヘッダー行を読み込む
// ヘッダーの処理
3.クォーテーションの処理: カンマを含むフィールドはダブルクォーテーションで囲まれていることがあります。このような場合、単純なSplit
では正しく処理できないため、より高度な解析が必要になります。
4.大きなファイルの処理: 非常に大きなCSVファイルを処理する場合は、StreamReader
を使用する方法が効率的です。全ての行を一度にメモリに読み込む方法は避けましょう。
応用例:CSVデータを構造化する
実際のアプリケーションでは、CSVデータを構造化したオブジェクトに変換することがよくあります。以下は、簡単な例です:
using System;
using System.IO;
using System.Collections.Generic;
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string City { get; set; }
}
class CsvStructuredReadExample
{
static void Main()
{
string filePath = "people.csv";
List<Person> people = new List<Person>();
try
{
using (StreamReader reader = new StreamReader(filePath))
{
// ヘッダー行をスキップ
reader.ReadLine();
string line;
while ((line = reader.ReadLine()) != null)
{
string[] values = line.Split(',');
if (values.Length == 3)
{
Person person = new Person
{
Name = values[0].Trim(),
Age = int.Parse(values[1].Trim()),
City = values[2].Trim()
};
people.Add(person);
}
}
}
// 読み込んだデータの表示
foreach (var person in people)
{
Console.WriteLine($"名前: {person.Name}, 年齢: {person.Age}, 都市: {person.City}");
}
}
catch (Exception e)
{
Console.WriteLine($"エラーが発生しました: {e.Message}");
}
}
}
この例では、CSVファイルから読み込んだデータをPerson
オブジェクトのリストに変換しています。
まとめ
C#でCSVファイルを1行ずつ読み込む方法は、StreamReader
クラスを使用することで簡単に実現できます。この方法は、大きなファイルを効率的に処理する場合に特に有用です。
CSVファイルの内容や目的に応じて、ヘッダーの処理やデータの構造化など、適切な方法を選択することが重要です。また、エンコーディングやクォーテーションの処理にも注意を払う必要があります。
これらの基本を押さえておけば、C#でのプログラミングでCSVファイルを扱う多くのタスクをこなすことができるでしょう。
コメント