C#で文字列を分割してみた(String.Split編)

Splitメソッドを使って、文字列をある文字で分割してみました。

目次

  1. 文字列をSplitする
  2. 試してみた
  3. 文字で分割する
  4. 文字列で分割する

文字列をSplitする

正規表現でMatchesを使えば分割できますが、もっとお手軽にString.Split()メソッドを使ってみました。 分割に使う仕切り(セパレータ)は、文字でも文字列でも指定できます。

string[] splitted = source.Split(separator_characters, option);
string[] splitted = source.Split(separator_strings, option);

引数

内容

source

string

分割される文字列。

separator_characters

char[]

仕切りの文字(セパレータ)の配列。配列の要素に1文字ずつ指定することで、複数指定できる。

separator_strings

string[]

仕切りの文字列(セパレータ)の配列。文字の場合と同様に複数指定できる。

option

StringSplitOptions

セパレータがchar[]の場合は省略可。分割結果の要素が空の場合に、それを戻り値に含めるかどうか指定する。

戻り値は、string型の配列です。

試してみた

こういうありがちなテキストを分割してみます。 170122-1-1

文字で分割する

スペースで分割してみました。

using System;
using System.Text;
using System.IO;

namespace split_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis")); // データ読み込み。

            // 分割する。
            char[] separator = new char[] {' '};
            string[] splitted = source.Split(separator);

            // ここで実行を停止する。
            foreach(var s in splitted)
            {
                Console.WriteLine(s);
            }
        }
    }
}

プログラムの実行を途中で止めて、文字列配列splittedの中身を見てみます。 170122-1-2 分割されてそれぞれ配列に格納されてますけど、改行コードが邪魔ですね。 というわけで、キャリッジリターンとラインフィードもセパレータに指定してみます。

using System;
using System.Text;
using System.IO;

namespace split_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis"));

            // 分割する。
            char[] separator = new char[] { ' ', '\r', '\n' };
            string[] splitted = source.Split(separator);

            // ここで実行を停止する。
            foreach(var s in splitted)
            {
                Console.WriteLine(s);
            }
        }
    }
}

そうすると文字列配列splittedの中身はこのようになります。 170122-1-3 使えそうですが、空の要素がなければもっと使い勝手が良さそうです。 ということで、分割のオプションを指定してみます。

using System;
using System.Text;
using System.IO;

namespace split_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis"));

            // 分割する。
            char[] separator = new char[] { ' ', '\r', '\n' };
            string[] splitted = source.Split(separator, StringSplitOptions.RemoveEmptyEntries);

            // ここで実行を停止する。
            foreach(var s in splitted)
            {
                Console.WriteLine(s);
            }
        }
    }
}

そうすると文字列配列splittedの中身はこのようになります。 170122-1-4 これなら使えそうです。

文字列で分割する

まず改行コードで分割してみます。

using System;
using System.Text;
using System.IO;

namespace split_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis"));

            // 分割する。
            string[] separator = new string[] {"\r\n"};
            string[] splitted = source.Split(separator, StringSplitOptions.None);

            // ここで実行を停止する。
            foreach(var s in splitted)
            {
                Console.WriteLine(s);
            }
        }
    }
}

そうすると文字列配列splittedの中身はこのようになります。 170122-1-5 ちゃんと文字列(キャリッジリターン+ラインフィード)で分割されてますね。 元のデータは歌毎に空行で分割していますので、セパレータを2連続の改行コードにしてみます。

using System;
using System.Text;
using System.IO;

namespace split_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis"));

            // 分割する。
            string[] separator = new string[] {"\r\n\r\n"};
            string[] splitted = source.Split(separator, StringSplitOptions.None);

            // ここで実行を停止する。
            foreach(var s in splitted)
            {
                Console.WriteLine(s);
            }
        }
    }
}

そうすると文字列配列splittedの中身はこのようになります。 170122-1-6 最後の要素に改行コードが残ってしまいました。 それならば、セパレータは改行コード1つにして、空要素を無視するようにしてみます。

using System;
using System.Text;
using System.IO;

namespace split_trial
{
    class Program
    {
        static void Main(string[] args)
        {
            string source = File.ReadAllText("data.txt", Encoding.GetEncoding("shift_jis"));

            // 分割する。
            string[] separator = new string[] {"\r\n"};
            string[] splitted = source.Split(separator, StringSplitOptions.RemoveEmptyEntries);

            // ここで実行を停止する。
            foreach(var s in splitted)
            {
                Console.WriteLine(s);
            }
        }
    }
}

そうすると文字列配列splittedの中身はこのようになります。 170122-1-7 これなら使い勝手良さそうです。 試した環境は下記です。

  • Visual Studio 2015 Express for Windows Desktop (C#)

  • Windows10

公開日

広告