C# Split完全ガイド|文字列を区切り文字で分割する基本から空要素・複数条件の対処法まで
はじめに
C#で文字列を扱うとき、最もよく使われる処理のひとつが「指定した区切り文字で文字列を分割する」ことです。たとえば、カンマ区切りのデータを配列に変換したり、スペースで区切られたユーザー入力を単語ごとに取り出したり、key=value形式の文字列からキーと値を分けたりする場面で使います。
このような処理で中心になるのが、string.Splitメソッドです。
Splitは一見シンプルですが、実際に使ってみると「空の要素が入る」「スペースが残る」「複数の区切り文字を指定したい」「最初の1回だけ分割したい」「CSVをうまく分割できない」といった疑問が出てきます。
この記事では、C#のSplitについて、基本構文から空要素の除外、複数区切り文字、文字列区切り、分割数の制限、Regex.Splitとの使い分け、よくある注意点までまとめて解説します。
1. C#のSplitとは?文字列を区切り文字で分割する基本
1-1. Splitメソッドでできること
C#のSplitメソッドは、文字列を指定した区切り文字で分割し、分割後の文字列を配列として返すメソッドです。
たとえば、次のようなカンマ区切りの文字列があるとします。
C#string text = "apple,banana,orange";
この文字列をカンマで分割すると、次のような3つの文字列に分けられます。
C#apple
banana
orange
コードでは次のように書けます。
C#string text = "apple,banana,orange";
string[] fruits = text.Split(',');
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
実行結果は次のとおりです。
apple
banana
orange
このように、Splitを使うと、1つの文字列を複数の要素に分解して扱えるようになります。
1-2. Splitがよく使われる場面
Splitは、文字列データをプログラムで扱いやすい形に変換したいときによく使われます。
代表的な場面は次のとおりです。
C#string csv = "1001,Tanaka,Tokyo";
string[] columns = csv.Split(',');
カンマ区切りのデータを列ごとに分ける例です。
C#string input = "red blue green";
string[] words = input.Split(' ');
スペースで区切られた入力を単語ごとに分ける例です。
C#string setting = "timeout=30";
string[] pair = setting.Split('=');
設定値のようなkey=value形式を、キーと値に分ける例です。
C#string path = "users/admin/documents";
string[] parts = path.Split('/');
パスやURLの一部をスラッシュで分割する例です。
このように、Splitは文字列処理の入口として非常に重要なメソッドです。
1-3. Splitの戻り値はstring配列
Splitの戻り値は、基本的にstring[]です。
C#string text = "A,B,C";
string[] result = text.Split(',');
このとき、resultには次のような値が入ります。
C#result[0] // "A"
result[1] // "B"
result[2] // "C"
配列なので、Lengthで要素数を確認できます。
C#Console.WriteLine(result.Length);
実行結果は次のとおりです。
3
また、インデックスを指定して特定の要素だけを取り出すこともできます。
C#Console.WriteLine(result[0]); // A
Console.WriteLine(result[1]); // B
Console.WriteLine(result[2]); // C
ただし、存在しないインデックスを指定すると例外が発生します。
C#Console.WriteLine(result[3]); // エラー
配列のインデックスは0から始まるため、最後の要素はresult[result.Length - 1]で取得します。
1-4. SubstringやIndexOfとの違い
文字列を取り出す方法には、Split以外にもSubstringやIndexOfがあります。
Substringは、指定した位置から文字列の一部を取り出すメソッドです。
C#string text = "HelloWorld";
string part = text.Substring(0, 5);
Console.WriteLine(part);
実行結果は次のとおりです。
Hello
IndexOfは、指定した文字や文字列が何番目にあるかを調べるメソッドです。
C#string text = "name=Tanaka";
int index = text.IndexOf('=');
Console.WriteLine(index);
一方、Splitは、区切り文字を基準に文字列全体をまとめて分割します。
C#string text = "name=Tanaka";
string[] result = text.Split('=');
Console.WriteLine(result[0]); // name
Console.WriteLine(result[1]); // Tanaka
つまり、使い分けの考え方は次のようになります。
Splitは、区切り文字で複数の要素に分けたいときに使います。
Substringは、位置が決まっている文字列の一部を取り出したいときに使います。
IndexOfは、特定の文字や文字列の位置を調べたいときに使います。
たとえば、カンマ区切りのように同じ規則で複数要素に分けるならSplitが便利です。一方で、文字列の先頭5文字だけを取り出すような処理ではSubstringの方が適しています。
2. string.Splitの基本構文と最短サンプル
2-1. カンマで文字列を分割する基本例
Splitの最も基本的な使い方は、1文字の区切り文字を指定する方法です。
C#string text = "apple,banana,orange";
string[] result = text.Split(',');
このコードでは、カンマ,を区切り文字として文字列を分割しています。
C#Console.WriteLine(result[0]);
Console.WriteLine(result[1]);
Console.WriteLine(result[2]);
実行結果は次のとおりです。
apple
banana
orange
Split(',')のように、区切り文字をシングルクォーテーションで囲む点に注意しましょう。
C#text.Split(',');
これはchar型の区切り文字を指定しています。
一方、ダブルクォーテーションで囲むと文字列になります。
C#text.Split(",");
C#のバージョンや対象フレームワークによっては、文字列区切りとして扱うために書き方が異なる場合があります。基本的には、1文字の区切りであればSplit(',')のようにcharを使うとわかりやすいです。
2-2. 分割結果をforeachで取り出す方法
Splitの戻り値は配列なので、foreachを使って順番に取り出すことができます。
C#string text = "apple,banana,orange";
string[] fruits = text.Split(',');
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
実行結果は次のとおりです。
apple
banana
orange
foreachを使うと、配列の要素数を意識せずにすべての要素を処理できます。
たとえば、分割した文字列を1つずつチェックする場合にも便利です。
C#string text = "C#,Java,Python";
foreach (string language in text.Split(','))
{
Console.WriteLine($"言語: {language}");
}
実行結果は次のとおりです。
言語: C#
言語: Java
言語: Python
分割結果を変数に保存せず、そのままforeachで使うこともできます。
2-3. 配列の要素数とインデックスの扱い
Splitした結果は配列なので、Lengthで要素数を確認できます。
C#string text = "A,B,C";
string[] result = text.Split(',');
Console.WriteLine(result.Length);
実行結果は次のとおりです。
3
配列の各要素は、0から始まるインデックスでアクセスします。
C#Console.WriteLine(result[0]); // A
Console.WriteLine(result[1]); // B
Console.WriteLine(result[2]); // C
ただし、存在しないインデックスにアクセスするとIndexOutOfRangeExceptionが発生します。
C#Console.WriteLine(result[3]); // エラー
実務では、分割結果の要素数が想定どおりとは限りません。
たとえば、次のような文字列を考えます。
C#string text = "name=Tanaka";
string[] parts = text.Split('=');
この場合は、parts[0]がキー、parts[1]が値になります。
C#if (parts.Length == 2)
{
string key = parts[0];
string value = parts[1];
Console.WriteLine($"{key}: {value}");
}
分割結果の要素数を確認してからアクセスすると、安全なコードになります。
2-4. Splitを使うときの基本的な考え方
Splitを使うときは、次の3点を意識すると失敗しにくくなります。
まず、何を区切り文字にするのかを決めます。
C#string text = "apple,banana,orange";
string[] result = text.Split(',');
この例ではカンマが区切り文字です。
次に、空要素を残すかどうかを考えます。
C#string text = "apple,,orange";
string[] result = text.Split(',');
この場合、appleとorangeの間に空文字が入ります。
C#result[0] // "apple"
result[1] // ""
result[2] // "orange"
空要素を除外したい場合は、StringSplitOptions.RemoveEmptyEntriesを使います。
C#string[] result = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
最後に、分割後の空白をどう扱うかを考えます。
C#string text = "apple, banana, orange";
string[] result = text.Split(',');
この場合、2番目以降の要素には先頭のスペースが残ります。
C#result[1] // " banana"
必要に応じてTrimやStringSplitOptions.TrimEntriesで空白を削除します。
このように、Splitでは「区切り文字」「空要素」「空白処理」を意識することが重要です。
3. 1文字の区切り文字で分割する方法
3-1. カンマ区切りの文字列を分割する
カンマ区切りの文字列は、Splitの代表的な使用例です。
C#string text = "red,green,blue";
string[] colors = text.Split(',');
foreach (string color in colors)
{
Console.WriteLine(color);
}
実行結果は次のとおりです。
red
green
blue
カンマ区切りのデータは、設定値や簡単な一覧データでよく使われます。
C#string ids = "101,102,103";
string[] idList = ids.Split(',');
foreach (string id in idList)
{
Console.WriteLine(id);
}
数値として扱いたい場合は、分割後に変換します。
C#string ids = "101,102,103";
foreach (string id in ids.Split(','))
{
int number = int.Parse(id);
Console.WriteLine(number);
}
ただし、入力値が常に正しいとは限らない場合は、int.TryParseを使うと安全です。
C#string ids = "101,102,abc";
foreach (string id in ids.Split(','))
{
if (int.TryParse(id, out int number))
{
Console.WriteLine(number);
}
}
Split自体は文字列を分割するだけなので、分割後の型変換は別途行います。
3-2. スペース区切りの文字列を分割する
スペースで区切られた文字列を分割する場合は、区切り文字に半角スペースを指定します。
C#string text = "apple banana orange";
string[] words = text.Split(' ');
foreach (string word in words)
{
Console.WriteLine(word);
}
実行結果は次のとおりです。
apple
banana
orange
ユーザーが入力した文字列を単語ごとに分けたい場合によく使います。
C#string input = "search keyword csharp split";
string[] keywords = input.Split(' ');
foreach (string keyword in keywords)
{
Console.WriteLine(keyword);
}
ただし、スペースが連続している場合は空要素が発生します。
C#string text = "apple banana orange";
string[] words = text.Split(' ');
foreach (string word in words)
{
Console.WriteLine($"[{word}]");
}
実行結果は次のようになります。
[apple]
[]
[banana]
[]
[]
[orange]
空要素を除外したい場合は、次のように書きます。
C#string[] words = text.Split(' ', StringSplitOptions.RemoveEmptyEntries);
スペース区切りでは、連続スペースへの対策が重要です。
3-3. タブ区切りの文字列を分割する
タブ区切りの文字列を分割する場合は、タブ文字\tを指定します。
C#string text = "id\tname\tage";
string[] columns = text.Split('\t');
foreach (string column in columns)
{
Console.WriteLine(column);
}
実行結果は次のとおりです。
id
name
age
タブ区切りのデータは、TSV形式の簡易処理などで使われます。
C#string line = "1001\tTanaka\t30";
string[] values = line.Split('\t');
Console.WriteLine(values[0]); // 1001
Console.WriteLine(values[1]); // Tanaka
Console.WriteLine(values[2]); // 30
タブは見た目ではスペースと区別しにくいため、コード上では\tを使って明示します。
C#string[] values = line.Split('\t');
半角スペース' 'とタブ'\t'は別の文字です。スペースで分割してもタブは区切り文字として扱われないため注意しましょう。
3-4. 改行コードで分割する
複数行の文字列を行ごとに分割したい場合は、改行コードで分割します。
C#string text = "line1\nline2\nline3";
string[] lines = text.Split('\n');
foreach (string line in lines)
{
Console.WriteLine(line);
}
実行結果は次のとおりです。
line1
line2
line3
ただし、Windows環境では改行が\r\nになっていることがあります。
C#string text = "line1\r\nline2\r\nline3";
この文字列を\nだけで分割すると、各行の末尾に\rが残ることがあります。
C#string[] lines = text.Split('\n');
foreach (string line in lines)
{
Console.WriteLine($"[{line}]");
}
結果として、見えにくい\rが残る可能性があります。
複数の改行コードに対応したい場合は、文字列区切りを使う方法があります。
C#string text = "line1\r\nline2\r\nline3";
string[] lines = text.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None);
foreach (string line in lines)
{
Console.WriteLine(line);
}
また、C#ではEnvironment.NewLineを使う方法もあります。
C#string[] lines = text.Split(Environment.NewLine);
ただし、Environment.NewLineは実行環境の改行コードを表すため、異なる環境で作られた文字列を処理する場合は、\r\nと\nの両方を考慮すると安全です。
3-5. コロン・セミコロン・スラッシュで分割する
カンマやスペース以外にも、さまざまな1文字を区切り文字にできます。
コロンで分割する例です。
C#string text = "host:localhost";
string[] parts = text.Split(':');
Console.WriteLine(parts[0]); // host
Console.WriteLine(parts[1]); // localhost
セミコロンで分割する例です。
C#string text = "red;green;blue";
string[] colors = text.Split(';');
foreach (string color in colors)
{
Console.WriteLine(color);
}
スラッシュで分割する例です。
C#string path = "users/admin/files";
string[] parts = path.Split('/');
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
users
admin
files
日付のような文字列にも使えます。
C#string date = "2026/06/14";
string[] parts = date.Split('/');
Console.WriteLine(parts[0]); // 2026
Console.WriteLine(parts[1]); // 06
Console.WriteLine(parts[2]); // 14
このように、Splitは指定した文字を基準に文字列を分割できます。
4. 複数の区切り文字で分割する方法
4-1. 複数のchar区切り文字を指定する
Splitでは、複数の区切り文字を指定できます。
たとえば、カンマ、セミコロン、スペースのいずれかで分割したい場合は、次のように書きます。
C#string text = "apple,banana;orange grape";
char[] separators = { ',', ';', ' ' };
string[] result = text.Split(separators);
foreach (string item in result)
{
Console.WriteLine(item);
}
実行結果は次のとおりです。
apple
banana
orange
grape
配列を変数にせず、直接指定することもできます。
C#string[] result = text.Split(new[] { ',', ';', ' ' });
複数の区切り文字を指定すると、「どれか1つに一致したら分割する」という動きになります。
つまり、,または;またはスペースで分割されます。
4-2. カンマまたはスペースで分割する
カンマまたはスペースで区切られた文字列を分割する例を見てみましょう。
C#string text = "C#, Java Python, Ruby";
string[] languages = text.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string language in languages)
{
Console.WriteLine(language);
}
実行結果は次のとおりです。
C#
Java
Python
Ruby
この例では、カンマとスペースの両方を区切り文字として指定しています。
さらに、StringSplitOptions.RemoveEmptyEntriesを指定しているため、連続した区切り文字によって発生する空要素は除外されます。
たとえば、"C#, Java"にはカンマの後にスペースがあります。
C#, Java
区切り文字がカンマとスペースの両方なので、カンマで分割された直後にスペースでも分割されます。その結果、空要素が発生する可能性があります。
そのため、複数の区切り文字を指定する場合は、RemoveEmptyEntriesを併用することがよくあります。
4-3. 区切り文字ごとの分割結果の違い
区切り文字の指定によって、分割結果は大きく変わります。
次の文字列を例にします。
C#string text = "apple, banana orange";
カンマだけで分割する場合です。
C#string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple]
[ banana orange]
カンマだけを区切り文字にしているため、スペースでは分割されません。
次に、スペースだけで分割します。
C#string[] result = text.Split(' ');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple,]
[banana]
[orange]
スペースで分割されるため、apple,のカンマは文字列に残ります。
最後に、カンマとスペースの両方で分割します。
C#string[] result = text.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple]
[banana]
[orange]
このように、どの文字を区切り文字にするかによって結果が変わります。目的に合った区切り文字を正しく指定することが重要です。
4-4. 複数条件でSplitする際の注意点
複数の区切り文字を指定すると便利ですが、意図しない分割が起こることもあります。
たとえば、スラッシュとハイフンを区切り文字にする場合を考えます。
C#string text = "2026/06-14";
string[] parts = text.Split(new[] { '/', '-' });
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
2026
06
14
これは期待どおりかもしれません。
しかし、次のような文字列では注意が必要です。
C#string text = "user-name/profile";
ハイフンとスラッシュで分割すると、ユーザー名の一部まで分割されます。
C#string[] parts = text.Split(new[] { '-', '/' });
結果は次のようになります。
user
name
profile
もしuser-nameを1つのまとまりとして扱いたいなら、ハイフンを区切り文字に含めるべきではありません。
また、複数の区切り文字を指定した場合、それぞれの区切り文字は結果には含まれません。
C#string text = "A+B-C";
string[] parts = text.Split(new[] { '+', '-' });
結果は次のようになります。
A
B
C
+や-がどちらだったかを後から判別したい場合、Splitだけでは不十分です。その場合は、正規表現や別の解析方法を検討します。
5. 文字列を区切り文字にして分割する方法
5-1. 文字列区切りと文字区切りの違い
Splitでは、1文字だけでなく、複数文字からなる文字列を区切りにすることもできます。
1文字の区切りはcharです。
C#string text = "A,B,C";
string[] result = text.Split(',');
複数文字の区切りはstringとして指定します。
C#string text = "A::B::C";
string[] result = text.Split("::");
この場合、::という2文字の並びが区切り文字として扱われます。
文字区切りと文字列区切りの違いは重要です。
C#string text = "A::B:C";
':'で分割すると、コロン1文字ごとに分割されます。
C#string[] result = text.Split(':');
結果は次のようになります。
A
B
C
::の部分では、連続したコロンによって空要素が発生します。
一方、"::"で分割すると、2文字の::だけが区切りとして扱われます。
C#string[] result = text.Split("::");
結果は次のようになります。
A
B:C
このように、1文字ずつ区切るのか、特定の文字列の並びで区切るのかを意識する必要があります。
5-2. 「::」や「--」など複数文字で分割する
::で分割する例です。
C#string text = "namespace::class::method";
string[] parts = text.Split("::");
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
namespace
class
method
--で分割する例です。
C#string text = "start--middle--end";
string[] parts = text.Split("--");
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
start
middle
end
複数文字の区切りは、ログや独自フォーマットのデータでよく使われます。
C#string log = "INFO -- Application started -- OK";
string[] parts = log.Split("--", StringSplitOptions.TrimEntries);
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
INFO
Application started
OK
TrimEntriesを使うと、分割後の前後の空白を削除できます。
5-3. 複数の文字列区切りを指定する
複数の文字列区切りを指定することもできます。
C#string text = "A::B--C";
string[] parts = text.Split(new[] { "::", "--" }, StringSplitOptions.None);
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
A
B
C
この例では、::または--のどちらかに一致した位置で分割されます。
空要素を除外したい場合は、RemoveEmptyEntriesを指定します。
C#string text = "A::B----C";
string[] parts = text.Split(new[] { "::", "--" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string part in parts)
{
Console.WriteLine(part);
}
結果は次のようになります。
A
B
C
----は--が連続しているものとして扱われるため、途中に空要素が発生する可能性があります。RemoveEmptyEntriesを使うことで空要素を除外できます。
5-4. 大文字・小文字を区別して分割される点に注意
string.Splitは、基本的に大文字・小文字を区別します。
たとえば、次の文字列を"END"で分割します。
C#string text = "appleENDbananaendorange";
string[] parts = text.Split("END");
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
apple
bananaendorange
ENDは区切り文字として扱われますが、endは一致しないため分割されません。
大文字・小文字を区別せずに分割したい場合、string.Splitだけでは対応しにくい場合があります。そのような場合は、Regex.Splitを使って正規表現オプションを指定する方法があります。
C#using System.Text.RegularExpressions;
string text = "appleENDbananaendorange";
string[] parts = Regex.Split(text, "end", RegexOptions.IgnoreCase);
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
apple
banana
orange
大文字・小文字を無視したい場合は、Regex.Splitの利用を検討しましょう。
6. 空要素を除外する方法
6-1. 空要素が発生する原因
Splitでは、区切り文字が連続していたり、文字列の先頭や末尾に区切り文字があったりすると、空要素が発生します。
たとえば、次の文字列をカンマで分割します。
C#string text = "apple,,orange";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple]
[]
[orange]
カンマが2つ連続しているため、間に空文字""が入ります。
先頭に区切り文字がある場合も空要素が発生します。
C#string text = ",apple,banana";
string[] result = text.Split(',');
結果は次のようになります。
[]
[apple]
[banana]
末尾に区切り文字がある場合も同様です。
C#string text = "apple,banana,";
string[] result = text.Split(',');
結果は次のようになります。
[apple]
[banana]
[]
このように、区切り文字の位置によって空要素が入ることがあります。
6-2. StringSplitOptions.RemoveEmptyEntriesの使い方
空要素を除外したい場合は、StringSplitOptions.RemoveEmptyEntriesを使います。
C#string text = "apple,,orange";
string[] result = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple]
[orange]
空文字の要素が除外されました。
複数の区切り文字を指定する場合にも使えます。
C#string text = "apple, banana orange";
string[] result = text.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in result)
{
Console.WriteLine(item);
}
実行結果は次のとおりです。
apple
banana
orange
RemoveEmptyEntriesは、連続する区切り文字が多い場合に特に便利です。
6-3. 連続する区切り文字を含む文字列の分割
連続する区切り文字がある場合、通常のSplitでは空要素が入ります。
C#string text = "A,,,B,,C";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[A]
[]
[]
[B]
[]
[C]
空要素を不要とするなら、RemoveEmptyEntriesを指定します。
C#string[] result = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[A]
[B]
[C]
ただし、空要素を除外してよいかどうかはデータの意味によります。
たとえば、CSV風のデータで空欄の列を表している場合、空要素を消すと列の位置がずれてしまいます。
C#string text = "Tanaka,,Tokyo";
このデータが「名前、年齢、住所」を表している場合、空の年齢列を削除してしまうと、Tokyoが年齢の位置にずれてしまう可能性があります。
そのため、空要素を除外するかどうかは、データの意味を考えて判断しましょう。
6-4. 先頭・末尾に区切り文字がある場合の挙動
先頭に区切り文字がある場合、通常は先頭に空要素が入ります。
C#string text = ",A,B";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[]
[A]
[B]
末尾に区切り文字がある場合、末尾に空要素が入ります。
C#string text = "A,B,";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[A]
[B]
[]
先頭と末尾の両方に区切り文字がある場合は、両方に空要素が発生します。
C#string text = ",A,B,";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[]
[A]
[B]
[]
RemoveEmptyEntriesを指定すると、これらの空要素は除外されます。
C#string[] result = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
結果は次のようになります。
[A]
[B]
6-5. 空要素を残すべきケースと除外すべきケース
空要素を残すべきか、除外すべきかは、データの性質によって変わります。
空要素を残すべき代表例は、列の位置に意味があるデータです。
C#string line = "Tanaka,,Tokyo";
string[] values = line.Split(',');
この場合、結果は次のようになります。
Tanaka
Tokyo
2番目の空要素は「年齢が未入力」のような意味を持つかもしれません。この空要素を削除すると、列の対応関係が崩れます。
一方、空要素を除外した方がよい例もあります。
C#string input = "apple banana orange";
string[] words = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
この場合、スペースの数には意味がなく、単語だけを取り出したいことが多いです。そのため、空要素を除外した方が扱いやすくなります。
つまり、判断基準は次のとおりです。
列数や位置に意味がある場合は、空要素を残します。
単語や値だけを取り出したい場合は、空要素を除外します。
RemoveEmptyEntriesは便利ですが、機械的に使うのではなく、データの意味に合わせて選びましょう。
7. 分割後の空白を処理する方法
7-1. Split後にTrimで前後の空白を削除する
Splitで分割した後、要素の前後に空白が残ることがあります。
C#string text = "apple, banana, orange";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple]
[ banana]
[ orange]
カンマの後にスペースがあるため、bananaやorangeの前に空白が残っています。
このような場合は、Trimを使って前後の空白を削除します。
C#string text = "apple, banana, orange";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item.Trim()}]");
}
実行結果は次のとおりです。
[apple]
[banana]
[orange]
配列として保存したい場合は、LINQを使って変換することもできます。
C#using System.Linq;
string text = "apple, banana, orange";
string[] result = text
.Split(',')
.Select(x => x.Trim())
.ToArray();
Trimは文字列の前後の空白を削除します。文字列の途中にある空白は削除されません。
C#string value = " hello world ";
Console.WriteLine(value.Trim());
実行結果は次のとおりです。
hello world
helloとworldの間の空白は残ります。
7-2. StringSplitOptions.TrimEntriesの使い方
C#では、StringSplitOptions.TrimEntriesを使うことで、分割後の各要素に対して前後の空白を削除できます。
C#string text = "apple, banana, orange";
string[] result = text.Split(',', StringSplitOptions.TrimEntries);
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple]
[banana]
[orange]
TrimEntriesを使うと、Split後に個別にTrimを書く必要がなくなります。
文字列区切りでも使えます。
C#string text = "INFO -- Application started -- OK";
string[] result = text.Split("--", StringSplitOptions.TrimEntries);
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[INFO]
[Application started]
[OK]
分割後の空白をまとめて処理したい場合に便利です。
7-3. RemoveEmptyEntriesとTrimEntriesを組み合わせる
RemoveEmptyEntriesとTrimEntriesは組み合わせて使えます。
C#string text = " apple, , banana, orange ";
string[] result = text.Split(
',',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
);
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[apple]
[banana]
[orange]
この例では、各要素の前後の空白を削除したうえで、空要素を除外しています。
ポイントは、空白だけの要素も除外できることです。
C#string text = "A, ,B";
TrimEntriesによって" "が""になり、RemoveEmptyEntriesによって除外されます。
C#string[] result = text.Split(
',',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
);
実務では、カンマ区切りの入力値をきれいに取り出すときによく使います。
C#string input = " red, blue, , green ";
string[] colors = input.Split(
',',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
);
結果は次のようになります。
red
blue
green
7-4. バージョンによるTrimEntries対応の違い
StringSplitOptions.TrimEntriesは、比較的新しいC#/.NET環境で使えるオプションです。
古い.NET Frameworkなどでは、TrimEntriesが使えない場合があります。
その場合は、Split後にTrimを使って処理します。
C#using System.Linq;
string text = "apple, banana, orange";
string[] result = text
.Split(',')
.Select(x => x.Trim())
.ToArray();
空要素の除外も同時に行いたい場合は、次のように書けます。
C#using System.Linq;
string text = " apple, , banana, orange ";
string[] result = text
.Split(',')
.Select(x => x.Trim())
.Where(x => x.Length > 0)
.ToArray();
TrimEntriesが使える環境なら次のように簡潔に書けます。
C#string[] result = text.Split(
',',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
);
プロジェクトの対象フレームワークによって使えるAPIが異なるため、エラーが出る場合はTrimとLINQで代替しましょう。
8. 分割数を制限する方法
8-1. count引数で最大分割数を指定する
Splitでは、分割する最大数を指定できます。
C#string text = "A,B,C,D";
string[] result = text.Split(',', 2);
foreach (string item in result)
{
Console.WriteLine(item);
}
実行結果は次のとおりです。
A
B,C,D
countに2を指定しているため、結果の要素数は最大2つになります。
最初のカンマで分割され、残りの文字列は2つ目の要素にまとめられます。
C#result[0] // "A"
result[1] // "B,C,D"
分割数を制限すると、「先頭部分だけ分けたい」「キーと値に分けたいが値の中には区切り文字が含まれる可能性がある」といった場面で便利です。
8-2. 最初の区切り文字だけで分割する
最初の区切り文字だけで分割したい場合は、countに2を指定します。
C#string text = "key=value=with=equals";
string[] parts = text.Split('=', 2);
Console.WriteLine(parts[0]);
Console.WriteLine(parts[1]);
実行結果は次のとおりです。
key
value=with=equals
通常のSplit('=')では、すべての=で分割されます。
C#string[] parts = text.Split('=');
結果は次のようになります。
key
value
with
equals
しかし、設定値などでは、最初の=だけを区切りにしたいことがあります。
C#string setting = "message=Hello=World";
string[] pair = setting.Split('=', 2);
この場合、pair[0]がキー、pair[1]が値になります。
C#pair[0] // "message"
pair[1] // "Hello=World"
値の中に区切り文字が含まれる可能性がある場合は、分割数の制限を使うと安全です。
8-3. 先頭部分と残りの文字列に分ける
ログやコマンドの解析では、先頭の要素と残りの文字列を分けたいことがあります。
C#string command = "send user@example.com Hello world";
string[] parts = command.Split(' ', 3);
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
send
user@example.com
Hello world
この例では、最大3要素に分割しています。
C#parts[0] // "send"
parts[1] // "user@example.com"
parts[2] // "Hello world"
メッセージ本文のように、残りの文字列にスペースが含まれる場合でも、最後の要素にまとめることができます。
別の例として、ログレベルとメッセージを分ける場合です。
C#string log = "ERROR File not found: data.txt";
string[] parts = log.Split(' ', 2);
string level = parts[0];
string message = parts[1];
Console.WriteLine(level);
Console.WriteLine(message);
実行結果は次のとおりです。
ERROR
File not found: data.txt
このように、countを使うと必要な部分だけ分割できます。
8-4. ログ・設定値・キーと値の分割での活用例
分割数の制限は、ログや設定値の解析で役立ちます。
設定値の例です。
C#string line = "timeout=30";
string[] parts = line.Split('=', 2);
if (parts.Length == 2)
{
string key = parts[0];
string value = parts[1];
Console.WriteLine($"key: {key}");
Console.WriteLine($"value: {value}");
}
実行結果は次のとおりです。
key: timeout
value: 30
値の中に=が含まれる場合でも対応できます。
C#string line = "message=Hello=World";
string[] parts = line.Split('=', 2);
結果は次のようになります。
message
Hello=World
ログの例です。
C#string log = "INFO:Application started:port=8080";
string[] parts = log.Split(':', 2);
Console.WriteLine(parts[0]); // INFO
Console.WriteLine(parts[1]); // Application started:port=8080
最初の区切りだけを使って、残りをメッセージとして扱えます。
このように、すべてを分割する必要がない場合は、countを指定することで意図しない分割を防げます。
9. よくある実践パターン別Splitの使い方
9-1. CSV風のカンマ区切りデータを分割する
簡単なカンマ区切りデータであれば、Split(',')で分割できます。
C#string line = "1001,Tanaka,Tokyo";
string[] columns = line.Split(',');
Console.WriteLine(columns[0]); // 1001
Console.WriteLine(columns[1]); // Tanaka
Console.WriteLine(columns[2]); // Tokyo
複数行のデータを処理する例です。
C#string data = "1001,Tanaka,Tokyo\n1002,Suzuki,Osaka";
string[] lines = data.Split('\n');
foreach (string line in lines)
{
string[] columns = line.Split(',');
Console.WriteLine($"ID: {columns[0]}, Name: {columns[1]}, City: {columns[2]}");
}
ただし、これはあくまで「CSV風」の単純なデータです。
次のような本格的なCSVは、単純なSplit(',')では正しく処理できません。
1001,"Tanaka,Taro",Tokyo
ダブルクォーテーション内のカンマは区切り文字ではないため、単純なSplitでは意図しない分割になります。
本格的なCSVを扱う場合は、CSVパーサーや専用ライブラリを使う方が安全です。
9-2. URLやパスをスラッシュで分割する
URLやパスのように、スラッシュで区切られた文字列を分割することもできます。
C#string path = "users/admin/files/report.txt";
string[] parts = path.Split('/');
foreach (string part in parts)
{
Console.WriteLine(part);
}
実行結果は次のとおりです。
users
admin
files
report.txt
URLの場合も同様です。
C#string url = "https://example.com/products/detail";
string[] parts = url.Split('/');
foreach (string part in parts)
{
Console.WriteLine($"[{part}]");
}
実行結果は次のようになります。
[https:]
[]
[example.com]
[products]
[detail]
https://の部分にスラッシュが2つあるため、空要素が発生します。
空要素を除外したい場合は、RemoveEmptyEntriesを使います。
C#string[] parts = url.Split('/', StringSplitOptions.RemoveEmptyEntries);
結果は次のようになります。
[https:]
[example.com]
[products]
[detail]
ただし、URLを正確に解析したい場合は、Uriクラスを使う方が適しています。
C#Uri uri = new Uri("https://example.com/products/detail");
Console.WriteLine(uri.Host); // example.com
Console.WriteLine(uri.AbsolutePath); // /products/detail
Splitは簡易的な分解には便利ですが、URL解析には専用のクラスを使う方が安全です。
9-3. 日付や時刻の文字列を分割する
日付の文字列をスラッシュやハイフンで分割することもできます。
C#string date = "2026/06/14";
string[] parts = date.Split('/');
string year = parts[0];
string month = parts[1];
string day = parts[2];
Console.WriteLine(year);
Console.WriteLine(month);
Console.WriteLine(day);
実行結果は次のとおりです。
2026
06
14
ハイフン区切りの日付も同じです。
C#string date = "2026-06-14";
string[] parts = date.Split('-');
時刻をコロンで分割する例です。
C#string time = "12:30:45";
string[] parts = time.Split(':');
Console.WriteLine(parts[0]); // 12
Console.WriteLine(parts[1]); // 30
Console.WriteLine(parts[2]); // 45
ただし、日付や時刻を正確に扱う場合は、DateTime.ParseやDateTime.TryParseを使う方が適切です。
C#string text = "2026/06/14";
if (DateTime.TryParse(text, out DateTime date))
{
Console.WriteLine(date.Year);
Console.WriteLine(date.Month);
Console.WriteLine(date.Day);
}
Splitは、文字列を単純に分解したい場合に使います。日付としての妥当性チェックや計算をしたい場合は、日付型に変換しましょう。
9-4. key=value形式の文字列を分割する
設定ファイルやクエリ文字列風のデータでは、key=value形式がよく使われます。
C#string text = "timeout=30";
string[] parts = text.Split('=', 2);
if (parts.Length == 2)
{
string key = parts[0];
string value = parts[1];
Console.WriteLine($"key: {key}");
Console.WriteLine($"value: {value}");
}
実行結果は次のとおりです。
key: timeout
value: 30
countに2を指定しているため、最初の=だけで分割されます。
値の中に=が含まれる場合でも安全です。
C#string text = "message=Hello=World";
string[] parts = text.Split('=', 2);
Console.WriteLine(parts[0]); // message
Console.WriteLine(parts[1]); // Hello=World
複数の設定行を処理する例です。
C#string[] lines =
{
"host=localhost",
"port=8080",
"debug=true"
};
foreach (string line in lines)
{
string[] parts = line.Split('=', 2);
if (parts.Length == 2)
{
Console.WriteLine($"{parts[0]} => {parts[1]}");
}
}
key=value形式では、分割結果が必ず2つになるとは限らないため、Lengthを確認してから使うのが安全です。
9-5. ユーザー入力をスペースで分割する
検索キーワードやコマンド入力のように、ユーザー入力をスペースで分割したい場面があります。
C#string input = "csharp split string";
string[] words = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
foreach (string word in words)
{
Console.WriteLine(word);
}
実行結果は次のとおりです。
csharp
split
string
ユーザー入力では、スペースが連続したり、先頭や末尾にスペースが入ったりすることがあります。
C#string input = " csharp split ";
このような場合は、RemoveEmptyEntriesを使うと不要な空要素を除外できます。
C#string[] words = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
さらに、タブなども区切りとして扱いたい場合は、複数の区切り文字を指定します。
C#string input = "csharp split\tstring";
string[] words = input.Split(
new[] { ' ', '\t' },
StringSplitOptions.RemoveEmptyEntries
);
複数の空白文字を柔軟に扱いたい場合は、Regex.Splitを使う方法もあります。
C#using System.Text.RegularExpressions;
string input = "csharp split\tstring";
string[] words = Regex.Split(input.Trim(), @"\s+");
単純なスペース区切りならstring.Split、複雑な空白処理ならRegex.Splitを検討しましょう。
9-6. 複数行テキストを行単位で分割する
複数行のテキストを行単位で処理したい場合は、改行コードで分割します。
C#string text = "line1\nline2\nline3";
string[] lines = text.Split('\n');
foreach (string line in lines)
{
Console.WriteLine(line);
}
Windowsの改行コード\r\nにも対応したい場合は、複数の文字列区切りを指定します。
C#string text = "line1\r\nline2\nline3";
string[] lines = text.Split(
new[] { "\r\n", "\n" },
StringSplitOptions.None
);
foreach (string line in lines)
{
Console.WriteLine(line);
}
空行を除外したい場合は、RemoveEmptyEntriesを使います。
C#string text = "line1\r\n\r\nline2\nline3";
string[] lines = text.Split(
new[] { "\r\n", "\n" },
StringSplitOptions.RemoveEmptyEntries
);
前後の空白も削除したい場合は、TrimEntriesを組み合わせます。
C#string[] lines = text.Split(
new[] { "\r\n", "\n" },
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
);
複数行テキストを扱うときは、改行コードの違いに注意しましょう。
10. Regex.Splitを使うべきケース
10-1. string.Splitでは対応しにくい分割条件
string.Splitは、指定した文字や文字列で分割するには便利です。
しかし、次のような条件では対応しにくいことがあります。
複数個の空白をまとめて1つの区切りとして扱いたい場合。
数字を区切りとして使いたい場合。
特定のパターンに一致する部分で分割したい場合。
大文字・小文字を無視して分割したい場合。
このような場合は、Regex.Splitを使うと柔軟に処理できます。
Regex.Splitを使うには、System.Text.RegularExpressionsを読み込みます。
C#using System.Text.RegularExpressions;
基本的な書き方は次のとおりです。
C#string[] result = Regex.Split(text, pattern);
patternには正規表現を指定します。
string.Splitよりも強力ですが、その分だけ正規表現の知識が必要になります。単純な区切り文字で十分な場合は、string.Splitの方が読みやすく、扱いやすいです。
10-2. 正規表現で複数の空白を区切りにする
複数の空白をまとめて区切りにしたい場合、Regex.Splitが便利です。
C#using System.Text.RegularExpressions;
string text = "apple banana\torange";
string[] words = Regex.Split(text, @"\s+");
foreach (string word in words)
{
Console.WriteLine(word);
}
実行結果は次のとおりです。
apple
banana
orange
正規表現の\sは空白文字を表します。スペース、タブ、改行などに一致します。
+は「1回以上の繰り返し」を表します。
つまり、@"\s+"は「1つ以上連続する空白文字」を意味します。
string.Splitで同じようなことをする場合は、区切り文字を複数指定します。
C#string[] words = text.Split(
new[] { ' ', '\t', '\n', '\r' },
StringSplitOptions.RemoveEmptyEntries
);
単純な空白分割であればこれでも対応できますが、正規表現を使うとより簡潔に書ける場合があります。
10-3. 数字・記号・パターンで分割する
Regex.Splitを使うと、数字や記号などのパターンを区切りとして使えます。
数字で分割する例です。
C#using System.Text.RegularExpressions;
string text = "apple123banana456orange";
string[] result = Regex.Split(text, @"\d+");
foreach (string item in result)
{
Console.WriteLine(item);
}
実行結果は次のとおりです。
apple
banana
orange
\dは数字を表し、+は1回以上の繰り返しを表します。つまり、@"\d+"は「1つ以上連続する数字」を意味します。
複数種類の記号で分割する例です。
C#string text = "A+B-C*D";
string[] result = Regex.Split(text, @"[+\-*]");
foreach (string item in result)
{
Console.WriteLine(item);
}
実行結果は次のとおりです。
A
B
C
D
角括弧[]は、その中のいずれか1文字に一致することを表します。
ただし、正規表現では記号に特別な意味がある場合があります。たとえば、.や+や*などはそのまま書くと別の意味になることがあります。必要に応じてエスケープしましょう。
10-4. string.SplitとRegex.Splitの使い分け
string.SplitとRegex.Splitは、目的に応じて使い分けることが大切です。
単純な区切り文字で分割するなら、string.Splitが適しています。
C#string text = "A,B,C";
string[] result = text.Split(',');
複数の固定文字で分割する場合も、string.Splitで十分です。
C#string text = "A,B;C D";
string[] result = text.Split(
new[] { ',', ';', ' ' },
StringSplitOptions.RemoveEmptyEntries
);
一方、パターンで分割したい場合は、Regex.Splitが適しています。
C#using System.Text.RegularExpressions;
string text = "A B\tC";
string[] result = Regex.Split(text, @"\s+");
使い分けの目安は次のとおりです。
固定の文字や文字列で分割するならstring.Split。
空白の連続、数字、特定パターンなどで分割するならRegex.Split。
読みやすさを優先するなら、まずstring.Splitを検討します。string.Splitで無理に複雑な処理をするより、正規表現の方が自然に書ける場合だけRegex.Splitを使うとよいでしょう。
11. Splitでよくあるエラー・つまずきポイント
11-1. 想定より空要素が多くなる
Splitでよくあるつまずきが、想定より空要素が多くなるケースです。
C#string text = "A,,B,";
string[] result = text.Split(',');
foreach (string item in result)
{
Console.WriteLine($"[{item}]");
}
実行結果は次のとおりです。
[A]
[]
[B]
[]
連続するカンマや末尾のカンマによって、空文字が配列に含まれます。
空要素が不要な場合は、RemoveEmptyEntriesを使います。
C#string[] result = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
ただし、空欄に意味があるデータでは削除してはいけません。
C#string line = "Tanaka,,Tokyo";
このようなデータでは、空要素が「未入力」を表している可能性があります。
空要素が多いからといって、常に削除するのではなく、データの意味を確認しましょう。
11-2. 区切り文字が見つからない場合の戻り値
区切り文字が見つからない場合、Splitは元の文字列を1要素だけ持つ配列を返します。
C#string text = "apple";
string[] result = text.Split(',');
Console.WriteLine(result.Length);
Console.WriteLine(result[0]);
実行結果は次のとおりです。
1
apple
空の配列になるわけではありません。
そのため、次のようなコードでは注意が必要です。
C#string text = "timeout";
string[] parts = text.Split('=');
Console.WriteLine(parts[1]); // エラー
=が含まれていないため、partsの要素数は1です。parts[1]にアクセスすると例外が発生します。
安全に処理するには、要素数を確認します。
C#string text = "timeout";
string[] parts = text.Split('=');
if (parts.Length == 2)
{
Console.WriteLine(parts[1]);
}
else
{
Console.WriteLine("key=value形式ではありません");
}
Splitした後は、期待する要素数があるか確認する習慣をつけましょう。
11-3. nullや空文字を扱うときの注意点
Splitを呼び出す対象の文字列がnullの場合、NullReferenceExceptionが発生します。
C#string text = null;
string[] result = text.Split(','); // エラー
nullの可能性がある場合は、事前にチェックします。
C#string text = null;
if (!string.IsNullOrEmpty(text))
{
string[] result = text.Split(',');
}
または、null合体演算子を使って空文字に置き換える方法もあります。
C#string text = null;
string[] result = (text ?? "").Split(',');
ただし、空文字をSplitすると、空文字1つを持つ配列になります。
C#string text = "";
string[] result = text.Split(',');
Console.WriteLine(result.Length);
Console.WriteLine($"[{result[0]}]");
実行結果は次のとおりです。
1
[]
空文字に対してRemoveEmptyEntriesを指定すると、空の配列になります。
C#string text = "";
string[] result = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(result.Length);
実行結果は次のとおりです。
0
null、空文字、空要素はそれぞれ意味が異なるため、区別して扱うことが大切です。
11-4. 改行コードの違いでうまく分割できない
改行で分割するときは、改行コードの違いに注意が必要です。
主な改行コードには、次のようなものがあります。
\n
\r\n
\r
たとえば、Windows由来の文字列は\r\nになっていることが多いです。
C#string text = "line1\r\nline2\r\nline3";
これを\nだけで分割すると、各行の末尾に\rが残ることがあります。
C#string[] lines = text.Split('\n');
foreach (string line in lines)
{
Console.WriteLine($"[{line}]");
}
見た目ではわかりにくいですが、文字列の末尾に\rが含まれる場合があります。
複数の改行コードに対応するなら、次のように書きます。
C#string[] lines = text.Split(
new[] { "\r\n", "\n", "\r" },
StringSplitOptions.None
);
空行を除外したい場合は、RemoveEmptyEntriesを指定します。
C#string[] lines = text.Split(
new[] { "\r\n", "\n", "\r" },
StringSplitOptions.RemoveEmptyEntries
);
改行コードは環境や入力元によって変わるため、複数行テキストを扱う場合は注意しましょう。
11-5. CSVのダブルクォーテーション内カンマは単純にSplitできない
CSVを扱うとき、最も注意すべき点は、ダブルクォーテーション内のカンマです。
たとえば、次のようなCSV行があります。
1001,"Tanaka,Taro",Tokyo
このデータは、実際には次の3列を表していると考えられます。
1001
Tanaka,Taro
Tokyo
しかし、単純にSplit(',')すると、ダブルクォーテーション内のカンマでも分割されてしまいます。
C#string line = "1001,\"Tanaka,Taro\",Tokyo";
string[] columns = line.Split(',');
foreach (string column in columns)
{
Console.WriteLine(column);
}
結果は次のようになります。
1001
"Tanaka
Taro"
Tokyo
本来3列のはずが、4つに分割されてしまいます。
このように、CSVには引用符、エスケープ、改行を含むフィールドなどのルールがあります。そのため、本格的なCSV処理ではSplitではなく、CSVパーサーや専用ライブラリを使うべきです。
Splitで対応できるのは、あくまで「カンマが単純な区切りとしてだけ使われている」簡易的なデータです。
12. Splitのパフォーマンスと注意点
12-1. Splitは新しい配列と文字列を生成する
Splitは便利ですが、内部的には分割結果を格納するための新しい配列を作ります。
C#string text = "A,B,C";
string[] result = text.Split(',');
この処理では、分割後の文字列を格納するstring[]が生成されます。
通常のアプリケーションではほとんど問題になりませんが、大量のデータを何度も処理する場合は、メモリ使用量や処理時間に影響することがあります。
たとえば、数百万行のログを1行ずつSplitするようなケースです。
C#foreach (string line in lines)
{
string[] parts = line.Split(',');
}
このような処理では、毎回新しい配列が作られます。
多くの場合は問題ありませんが、性能が重要な処理では注意が必要です。
12-2. 大量データ処理で注意すべきこと
大量データを処理する場合、Splitで毎回すべての要素を分割する必要があるかを考えましょう。
たとえば、次のようなデータがあるとします。
C#string line = "1001,Tanaka,Tokyo,Sales,Active";
もし必要なのが先頭のIDだけであれば、すべてをSplitする必要はありません。
C#string[] parts = line.Split(',');
string id = parts[0];
このコードでも動きますが、不要な要素まで分割しています。
先頭のカンマ位置だけを知りたい場合は、IndexOfを使う方法もあります。
C#int index = line.IndexOf(',');
if (index >= 0)
{
string id = line.Substring(0, index);
Console.WriteLine(id);
}
大量データを処理する場合は、「必要な情報だけを取り出す」設計にすると効率的です。
12-3. 必要な分割だけ行う設計にする
Splitには分割数を制限する機能があります。
C#string line = "ERROR:File not found:details";
string[] parts = line.Split(':', 2);
このように書くと、最初の区切り文字だけで分割し、残りはまとめて取得できます。
C#parts[0] // ERROR
parts[1] // File not found:details
すべての区切り文字で分割する必要がない場合は、countを指定することで余計な分割を減らせます。
key=value形式でも有効です。
C#string line = "message=Hello=World";
string[] parts = line.Split('=', 2);
結果は次のようになります。
message
Hello=World
必要な分割だけ行うことで、意図しない分割を防げるだけでなく、処理の無駄も減らせます。
12-4. 高速化が必要な場合の代替手段
通常の文字列処理では、Splitで十分です。
しかし、大量データや高頻度処理でパフォーマンスが問題になる場合は、代替手段を検討します。
先頭の要素だけ必要なら、IndexOfとSubstringを使えます。
C#string line = "1001,Tanaka,Tokyo";
int index = line.IndexOf(',');
if (index >= 0)
{
string first = line.Substring(0, index);
Console.WriteLine(first);
}
分割数を制限できる場合は、Splitのcountを使います。
C#string[] parts = line.Split(',', 2);
より低レベルにメモリ割り当てを抑えたい場合は、ReadOnlySpan<char>を使った処理を検討することもあります。
ただし、Spanを使ったコードはやや複雑になります。まずは読みやすいSplitで実装し、実際にパフォーマンス上の問題が出た場合に最適化を検討するのが現実的です。
パフォーマンス改善では、推測だけで判断せず、実際に計測することが大切です。
まとめ
C#のSplitは、文字列を区切り文字で分割するための基本的かつ重要なメソッドです。
カンマ、スペース、タブ、改行、スラッシュなど、さまざまな文字を区切りとして使えます。
C#string text = "apple,banana,orange";
string[] result = text.Split(',');
複数の区切り文字を指定することもできます。
C#string[] result = text.Split(new[] { ',', ';', ' ' });
::や--のような複数文字の区切りには、文字列区切りを使います。
C#string[] result = text.Split("::");
空要素を除外したい場合は、StringSplitOptions.RemoveEmptyEntriesを使います。
C#string[] result = text.Split(',', StringSplitOptions.RemoveEmptyEntries);
分割後の空白を削除したい場合は、TrimやStringSplitOptions.TrimEntriesを使います。
C#string[] result = text.Split(
',',
StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries
);
最初の区切り文字だけで分割したい場合は、count引数を指定します。
C#string[] result = text.Split('=', 2);
また、複数の空白や数字、特定パターンで分割したい場合は、Regex.Splitが有効です。
C#string[] result = Regex.Split(text, @"\s+");
ただし、CSVのように引用符やエスケープを含む複雑な形式は、単純なSplitでは正しく処理できないことがあります。その場合は専用のパーサーを使う方が安全です。
Splitを使うときは、区切り文字、空要素、空白処理、分割数、データの意味を意識することが大切です。基本を押さえておけば、C#の文字列処理をよりシンプルで読みやすく書けるようになります。

