文字列の「分割」処理
C#でプログラミングを行う際、string型で受け取った一つの長いデータを、特定の「区切り文字(デリミタ)」に基づいて複数の部分文字列に分割し、配列として扱いたい場面が非常に多くあります。
代表的な例としては、CSV(カンマ区切り)データや、スペース区切りのログファイル、タブ区切りの設定ファイルなどです。
この操作を標準でサポートするのが string.Split メソッドです。この記事では、Splitメソッドの基本的な使い方から、複数の区切り文字を指定する方法、そして重要なオプションであるStringSplitOptionsまでを解説します。
Splitメソッドの基本 (単一の区切り文字)
Splitメソッドの最も基本的な形式は、char(1文字)の区切り文字を指定するものです。これにより、文字列がその文字で分割され、結果がstring[](文字列の配列)として返されます。
コード例1: カンマ区切り(CSV)
using System;
public class SplitBasicExample
{
public static void Main()
{
string csvData = "ProductID,ProductName,Price";
char delimiter = ','; // 単一の区切り文字 (char)
// ',' を基準に文字列を分割
string[] columns = csvData.Split(delimiter);
Console.WriteLine($"元の文字列: {csvData}");
Console.WriteLine("--- 分割結果 ---");
// 分割された配列を foreach で処理
foreach (var column in columns)
{
Console.WriteLine($"[{column}]");
}
}
}
出力結果:
元の文字列: ProductID,ProductName,Price
--- 分割結果 ---
[ProductID]
[ProductName]
[Price]
複数の区切り文字を指定する方法
カンマ(,)とタブ(\t)の両方で分割したい、といったケースもあります。Splitメソッドは、char[](文字の配列)を受け取ることで、複数の区切り文字に同時に対応できます。
コード例2: char[] による複数指定
using System;
public class SplitMultipleExample
{
public static void Main()
{
// スペースとタブが混在するデータ
string mixedData = "Value1\tValue2 Value3 Value4";
// 2つの区切り文字を配列で指定
char[] delimiters = new char[] { ' ', '\t' };
string[] items = mixedData.Split(delimiters);
Console.WriteLine($"元の文字列: {mixedData}");
Console.WriteLine("--- 分割結果 ---");
foreach (var item in items)
{
Console.WriteLine($"[{item}]");
}
}
}
出力結果:
元の文字列: Value1 Value2 Value3 Value4
--- 分割結果 ---
[Value1]
[Value2]
[Value3]
[Value4]
重要なオプション: StringSplitOptions
Splitメソッドを使用する際、しばしば問題となるのが「空の要素」です。
例えば、"A,,B" という文字列を , で分割すると、["A", "", "B"] のように、AとBの間に空文字列("")が生成されてしまいます。また、"A,B," のように末尾が区切り文字の場合も、最後に空文字列が生成されます。
StringSplitOptions列挙型を使用することで、この動作を制御できます。
StringSplitOptions.None(デフォルト): 空の要素もすべて配列に含めます。StringSplitOptions.RemoveEmptyEntries: 分割によって生じた空文字列("")を、結果の配列から自動的に除去します。
コード例3: RemoveEmptyEntries の使用
データに連続した区切り文字や、末尾の区切り文字が含まれる場合の比較です。
using System;
public class SplitOptionsExample
{
public static void Main()
{
// 区切り文字が連続 (||) したり、末尾 (|) にある
string logLine = "Level=INFO||Source=App1|Message=OK|";
char[] delimiters = { '|' };
// 1. オプションなし (デフォルト)
string[] partsDefault = logLine.Split(delimiters, StringSplitOptions.None);
Console.WriteLine("--- オプションなし (None) ---");
foreach (var part in partsDefault)
{
Console.WriteLine($"'{part}'");
}
// 2. 空エントリを削除
string[] partsRemoved = logLine.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine("\n--- RemoveEmptyEntries 使用 ---");
foreach (var part in partsRemoved)
{
Console.WriteLine($"'{part}'");
}
}
}
出力結果:
--- オプションなし (None) ---
'Level=INFO'
''
'Source=App1'
'Message=OK'
''
--- RemoveEmptyEntries 使用 ---
'Level=INFO'
'Source=App1'
'Message=OK'
RemoveEmptyEntriesを使用することで、||(連続)や末尾の|によって発生した不要な空文字列が自動的に除去され、有効なデータだけが配列に残ることがわかります。
補足:文字列(string)による分割
Splitメソッドは、charだけでなくstring[](文字列の配列)を区切り文字として指定することもできます(.NET Core 2.1 / .NET 5 以降でより柔軟になりました)。
これは、<br>や--END--のような、複数の文字からなる区切り文字列で分割したい場合に便利です。
string htmlContent = "Item 1<br>Item 2<br />Item 3";
string[] separators = { "<br>", "<br />" }; // 複数の文字列区切り
string[] lines = htmlContent.Split(separators, StringSplitOptions.RemoveEmptyEntries);
// 結果: ["Item 1", "Item 2", "Item 3"]
まとめ
string.Splitメソッドは、C#で文字列を効率的に分割するための基本的な機能です。
- 単一の区切り文字は
Split(char)で指定します。 - 複数の区切り文字は
Split(char[])で指定します。 - 連続した区切り文字によって発生する空の要素を除去したい場合は、
StringSplitOptions.RemoveEmptyEntriesを指定することが強く推奨されます。
