基礎から学ぶC#入門 90日コース | 配列・コレクション・文字列 - Day 25:文字列操作 実践

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク
  1. Day 25 のゴールと全体像
  2. Trim:前後の空白を取り除く
    1. なぜ Trim が重要なのか
    2. Trim の基本
  3. Split:文字列を分割する
    1. 「1つの文字列を複数の要素に分ける」
    2. Split の基本
  4. Join:配列を 1 つの文字列にまとめる
    1. Split の逆のイメージ
    2. Join の基本
  5. Replace:文字列の一部を置き換える
    1. 「古い文字列を新しい文字列に差し替える」
    2. Replace の基本
  6. Contains:部分文字列が含まれているか調べる
    1. 「この文字列の中に、あの単語はある?」
    2. Contains の基本
  7. StartsWith:指定した文字列で始まっているか
    1. 「この文字列は、特定の接頭辞で始まる?」
    2. StartsWith の基本
  8. EndsWith:指定した文字列で終わっているか
    1. 「この文字列は、特定の拡張子で終わる?」
    2. EndsWith の基本
  9. 総合例:ユーザー入力を解析するミニ処理
    1. Trim + Split + Contains + StartsWith + EndsWith を組み合わせる
  10. Day 25 のまとめ
  11. Day 25 ミニ課題のゴールと全体像
  12. CSV形式の文字列とは何か
    1. カンマ区切りの「1行のデータ」
  13. Step 1:Trim で前後の余計な空白を取り除く
    1. 入力文字列を「まずきれいにする」
  14. Step 2:Split で CSV を配列に分解する
    1. カンマで分割して「フィールド」に分ける
  15. Step 3:Join で配列を再び CSV に戻す
    1. 「加工したデータを再度 CSV 形式にする」
  16. Step 4:Replace でフィールドの内容を置き換える
    1. 例:都市名を別表記に変える
  17. Step 5:Contains で特定の値を含むかチェックする
    1. 例:CSVの中に「Tokyo」が含まれているか
  18. Step 6:StartsWith / EndsWith でパターンを判定する
    1. 例:IDフィールドや拡張子フィールドの判定
  19. ミニ課題完成版:CSV 1 行を解析・整形するコンソールプログラム
    1. すべてのメソッドを組み合わせた実践例
  20. Day 25 ミニ課題のまとめ

Day 25 のゴールと全体像

Day 25 では、C# の文字列操作を一気に実践レベルまで引き上げることを目標にします。 扱うメソッドは次の 7 つです。

  • Trim
  • Split
  • Join
  • Replace
  • Contains
  • StartsWith
  • EndsWith

これらは、入力チェック・ログ解析・CSV処理・検索機能など、 現場のコードで本当によく使われる「文字列操作の基本セット」です。

1つずつ動きと使いどころを理解しながら、 最後には「実践的な文字列処理」を組み立てられるところまで持っていきます。

Trim:前後の空白を取り除く

なぜ Trim が重要なのか

ユーザー入力やファイルから読み込んだ文字列には、 意図しない「前後の空白」や改行が含まれていることがよくあります。

例:

  • " hello"
  • "world "
  • " test "

このまま比較や検索をすると、 「同じ文字列のはずなのに一致しない」というバグの原因になります。

そこで使うのが Trim です。

Trim の基本

using System;

class Program
{
    static void Main(string[] args)
    {
        string raw = "  hello world  "; // 前後に空白がある文字列

        // 前後の空白を取り除きます
        string trimmed = raw.Trim();

        Console.WriteLine($"元の文字列: \"{raw}\"");
        Console.WriteLine($"Trim後: \"{trimmed}\"");

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Trim() は、文字列の「前後」の空白文字(スペース・タブ・改行など)を取り除きます。
  • 中央の空白はそのまま残ります("hello world" の空白は残る)。
  • ユーザー入力やファイル入力を扱うときは、まず Trim してから処理するのが定石です。

Split:文字列を分割する

「1つの文字列を複数の要素に分ける」

Split は、

区切り文字を指定して、文字列を複数の部分に分割する

ためのメソッドです。

例えば、カンマ区切りの文字列:

  • "apple,banana,orange"

Split(',') すると、

  • "apple"
  • "banana"
  • "orange"

という 3 つの文字列に分かれます。

Split の基本

using System;

class Program
{
    static void Main(string[] args)
    {
        string csv = "apple,banana,orange";

        // カンマで分割します
        string[] items = csv.Split(',');

        Console.WriteLine("=== Split の結果 ===");
        for (int i = 0; i < items.Length; i++)
        {
            Console.WriteLine($"items[{i}] = \"{items[i]}\"");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Split の戻り値は「文字列の配列」です。
  • 区切り文字は 1 つだけでなく、複数指定することもできます(Split(',', ';') など)。
  • CSVやログの解析など、「1行を分解して意味のある単位にする」場面でよく使われます。

Join:配列を 1 つの文字列にまとめる

Split の逆のイメージ

Join は、

複数の文字列(配列やコレクション)を、区切り文字を挟んで 1 つの文字列にする

ためのメソッドです。

Split が「分解」なら、Join は「結合」です。

Join の基本

using System;

class Program
{
    static void Main(string[] args)
    {
        string[] items = { "apple", "banana", "orange" };

        // カンマ区切りの文字列に結合します
        string csv = string.Join(",", items);

        Console.WriteLine("=== Join の結果 ===");
        Console.WriteLine(csv); // "apple,banana,orange"

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • string.Join(区切り文字, 配列) の形で使います。
  • 配列や List<string> を「1行の文字列」にしたいときに便利です。
  • ファイル出力やログ出力など、「複数の値を1行にまとめたい」場面でよく使われます。

Replace:文字列の一部を置き換える

「古い文字列を新しい文字列に差し替える」

Replace は、

指定した文字列(または文字)を、別の文字列に置き換える

ためのメソッドです。

例えば、

  • "Hello World""World""C#" に変えたい

というときに使います。

Replace の基本

using System;

class Program
{
    static void Main(string[] args)
    {
        string text = "Hello World";

        // "World" を "C#" に置き換えます
        string replaced = text.Replace("World", "C#");

        Console.WriteLine($"元の文字列: {text}");
        Console.WriteLine($"Replace後: {replaced}");

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Replace(検索文字列, 置換文字列) の形で使います。
  • 一致する部分はすべて置き換えられます。
  • URLの一部を書き換えたり、テンプレート文字列の一部を差し替えたりするときに便利です。

Contains:部分文字列が含まれているか調べる

「この文字列の中に、あの単語はある?」

Contains は、

指定した文字列が、対象の文字列の中に含まれているかどうか

を調べるためのメソッドです。

Contains の基本

using System;

class Program
{
    static void Main(string[] args)
    {
        string text = "今日はC#の勉強をします。";

        bool hasCSharp = text.Contains("C#");
        bool hasJava = text.Contains("Java");

        Console.WriteLine($"\"C#\" を含む?: {hasCSharp}");
        Console.WriteLine($"\"Java\" を含む?: {hasJava}");

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Contains(部分文字列) は、含まれていれば true、含まれていなければ false を返します。
  • 検索機能やフィルタリングなど、「条件に合う文字列だけを選びたい」ときに使われます。

StartsWith:指定した文字列で始まっているか

「この文字列は、特定の接頭辞で始まる?」

StartsWith は、

文字列が、指定した文字列で始まっているかどうか

を調べるためのメソッドです。

例えば、

  • "INFO: ..." で始まるログだけを抽出したい
  • "https://" で始まる URL だけをチェックしたい

といった場面で使います。

StartsWith の基本

using System;

class Program
{
    static void Main(string[] args)
    {
        string log1 = "INFO: アプリケーションが起動しました。";
        string log2 = "ERROR: 例外が発生しました。";

        bool isInfo = log1.StartsWith("INFO");
        bool isError = log2.StartsWith("ERROR");

        Console.WriteLine($"log1 は \"INFO\" で始まる?: {isInfo}");
        Console.WriteLine($"log2 は \"ERROR\" で始まる?: {isError}");

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • StartsWith(文字列) は、「接頭辞(prefix)」のチェックに使います。
  • ログレベル・URL・ファイルパスなど、「先頭のパターンで意味が決まる」文字列に対して有効です。

EndsWith:指定した文字列で終わっているか

「この文字列は、特定の拡張子で終わる?」

EndsWith は、

文字列が、指定した文字列で終わっているかどうか

を調べるためのメソッドです。

例えば、

  • ".txt" で終わるファイル名だけを処理したい
  • ".jpg" で終わる画像ファイルだけを対象にしたい

といった場面で使います。

EndsWith の基本

using System;

class Program
{
    static void Main(string[] args)
    {
        string file1 = "document.txt";
        string file2 = "image.jpg";

        bool isText = file1.EndsWith(".txt");
        bool isJpeg = file2.EndsWith(".jpg");

        Console.WriteLine($"file1 は \".txt\" で終わる?: {isText}");
        Console.WriteLine($"file2 は \".jpg\" で終わる?: {isJpeg}");

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • EndsWith(文字列) は、「接尾辞(suffix)」のチェックに使います。
  • ファイル拡張子・特定の終端記号など、「末尾のパターンで意味が決まる」文字列に対して有効です。

総合例:ユーザー入力を解析するミニ処理

Trim + Split + Contains + StartsWith + EndsWith を組み合わせる

最後に、Day 25 のメソッドを組み合わせた、 簡単な「ユーザー入力解析」の例を示します。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("カンマ区切りでファイル名を入力してください(例: a.txt, b.jpg, c.png):");
        string? input = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(input))
        {
            Console.WriteLine("入力が空です。終了します。");
            return;
        }

        // 前後の空白を取り除きます
        string trimmed = input.Trim();

        // カンマで分割します
        string[] files = trimmed.Split(',');

        Console.WriteLine("\n=== 解析結果 ===");

        foreach (string rawFile in files)
        {
            // 各要素の前後の空白も Trim しておくと安全です
            string file = rawFile.Trim();

            Console.WriteLine($"\nファイル名: \"{file}\"");

            // .txt かどうか
            if (file.EndsWith(".txt"))
            {
                Console.WriteLine("→ テキストファイルです。");
            }
            else if (file.EndsWith(".jpg") || file.EndsWith(".png"))
            {
                Console.WriteLine("→ 画像ファイルです。");
            }
            else
            {
                Console.WriteLine("→ 種類不明のファイルです。");
            }

            // "temp" を含むかどうか
            if (file.Contains("temp"))
            {
                Console.WriteLine("→ ファイル名に \"temp\" が含まれています(一時ファイルかもしれません)。");
            }

            // "backup_" で始まるかどうか
            if (file.StartsWith("backup_"))
            {
                Console.WriteLine("→ バックアップファイルの可能性があります。");
            }
        }

        Console.ReadLine();
    }
}
C#

この総合例で体験できること:

  • Trim で入力の前後の空白を取り除く重要性
  • Split で 1 行を複数の要素に分解する流れ
  • EndsWith で拡張子を判定し、ContainsStartsWith で名前のパターンをチェックする実践的な使い方

Day 25 のまとめ

Day 25 では、文字列操作の実践的なメソッドをまとめて学びました。

  • Trim:前後の空白を取り除く
  • Split:区切り文字で分割して配列にする
  • Join:配列を区切り文字で結合して 1 つの文字列にする
  • Replace:文字列の一部を別の文字列に置き換える
  • Contains:部分文字列が含まれているか調べる
  • StartsWith:指定した文字列で始まっているか調べる
  • EndsWith:指定した文字列で終わっているか調べる

これらは、

「文字列をきれいに整える」「文字列から意味を取り出す」

ための基本ツールです。

ぜひ、

  • ログの1行を Split して解析してみる
  • ユーザー入力を Trim してからチェックする
  • ファイル一覧から特定の拡張子だけを EndsWith で抽出する

といった小さな練習を積み重ねながら、 文字列操作を「怖いもの」ではなく「頼れる道具」として使いこなしていってください。


Day 25 ミニ課題のゴールと全体像

Day 25 のミニ課題では、CSV形式の文字列を分解・加工する処理を作ることを目標にします。 CSVは「カンマ区切りのテキスト」で、現場のシステムでも非常によく使われる形式です。

ここでは、

  • 1行の CSV 文字列を TrimSplit で「きれいに分解」する
  • 分解したデータを Join で再び CSV 形式に戻す
  • ReplaceContainsStartsWithEndsWith を組み合わせて、 文字列の内容をチェック・加工する

という流れで、ステップバイステップで解説していきます。

CSV形式の文字列とは何か

カンマ区切りの「1行のデータ」

CSV(Comma-Separated Values)は、

  • ,(カンマ)で値を区切ったテキスト形式
  • 1行が1レコード(1件のデータ)

というシンプルなルールで構成されています。

例:

"Yamada, Taro, 30, Tokyo"

この 1 行には、

  • 名前:Yamada
  • 名前(名):Taro
  • 年齢:30
  • 住所:Tokyo

といった情報が含まれていると考えられます。

Step 1:Trim で前後の余計な空白を取り除く

入力文字列を「まずきれいにする」

CSV文字列は、ユーザー入力やファイル読み込みの都合で、 前後に余計な空白や改行が付いていることがあります。

例:

"  Yamada, Taro, 30, Tokyo  "

このまま Split すると、 各要素の前後にも空白が残ってしまい、後の処理がやりづらくなります。

そこで、まず Trim を使って前後の空白を取り除きます。

using System;

class Program
{
    static void Main(string[] args)
    {
        // 前後に空白がある CSV 文字列
        string rawCsv = "  Yamada, Taro, 30, Tokyo  ";

        // 前後の空白を取り除きます
        string trimmedCsv = rawCsv.Trim();

        Console.WriteLine($"元の文字列: \"{rawCsv}\"");
        Console.WriteLine($"Trim後:      \"{trimmedCsv}\"");

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Trim() は「前後の空白」を取り除きます。
  • CSV処理では、まず入力全体を Trim してから Split するのが定石です。

Step 2:Split で CSV を配列に分解する

カンマで分割して「フィールド」に分ける

次に、Split を使って CSV 文字列を「フィールド」に分解します。

using System;

class Program
{
    static void Main(string[] args)
    {
        string rawCsv = "  Yamada, Taro, 30, Tokyo  ";

        // 1. 前後の空白を取り除く
        string trimmedCsv = rawCsv.Trim();

        // 2. カンマで分割する
        string[] fields = trimmedCsv.Split(',');

        Console.WriteLine("=== Split の結果 ===");
        for (int i = 0; i < fields.Length; i++)
        {
            Console.WriteLine($"fields[{i}] = \"{fields[i]}\"");
        }

        Console.ReadLine();
    }
}
C#

このままだと、各フィールドの前後に空白が残っています。

  • "Yamada"
  • " Taro"
  • " 30"
  • " Tokyo"

そこで、各フィールドにも Trim をかけると、よりきれいになります。

using System;

class Program
{
    static void Main(string[] args)
    {
        string rawCsv = "  Yamada, Taro, 30, Tokyo  ";

        string trimmedCsv = rawCsv.Trim();
        string[] fields = trimmedCsv.Split(',');

        Console.WriteLine("=== 各フィールドを Trim した結果 ===");
        for (int i = 0; i < fields.Length; i++)
        {
            string field = fields[i].Trim(); // 各要素の前後の空白も取り除く
            Console.WriteLine($"fields[{i}] = \"{field}\"");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Split(',') で「カンマ区切り」を分解します。
  • CSVでは、全体を Trim → Split → 各要素を Trimという流れが基本形です。

Step 3:Join で配列を再び CSV に戻す

「加工したデータを再度 CSV 形式にする」

分解したフィールドを加工したあと、 再び CSV 形式の文字列として出力したいことがあります。

そのときに使うのが string.Join です。

using System;

class Program
{
    static void Main(string[] args)
    {
        string rawCsv = "  Yamada, Taro, 30, Tokyo  ";

        string trimmedCsv = rawCsv.Trim();
        string[] fields = trimmedCsv.Split(',');

        // 各フィールドを Trim して新しい配列に入れ直します
        for (int i = 0; i < fields.Length; i++)
        {
            fields[i] = fields[i].Trim();
        }

        // Join で再び CSV 形式に結合します
        string normalizedCsv = string.Join(", ", fields);

        Console.WriteLine("=== 正規化された CSV ===");
        Console.WriteLine(normalizedCsv); // "Yamada, Taro, 30, Tokyo"

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • string.Join(", ", fields) のように、区切り文字を指定して結合します。
  • 「分解して整形して、再び CSV に戻す」という流れを作ることで、 入力の正規化(きれいな形に整える)ができます。

Step 4:Replace でフィールドの内容を置き換える

例:都市名を別表記に変える

CSVの中の特定フィールドの内容を置き換えたい場合、 Replace を使って文字列の一部を差し替えます。

例として、"Tokyo""東京都" に変えてみます。

using System;

class Program
{
    static void Main(string[] args)
    {
        string rawCsv = "Yamada, Taro, 30, Tokyo";

        string[] fields = rawCsv.Split(',');

        // 各フィールドを Trim
        for (int i = 0; i < fields.Length; i++)
        {
            fields[i] = fields[i].Trim();
        }

        // 4番目のフィールド(住所)を Replace で書き換える
        // ここでは単純に "Tokyo" を "東京都" に置き換えます
        if (fields.Length >= 4)
        {
            fields[3] = fields[3].Replace("Tokyo", "東京都");
        }

        string newCsv = string.Join(", ", fields);

        Console.WriteLine("=== Replace 後の CSV ===");
        Console.WriteLine(newCsv); // "Yamada, Taro, 30, 東京都"

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Replace は「文字列全体」に対して動くので、 フィールド単位で使うときは、対象フィールドを選んでから適用します。
  • 住所やメッセージの一部を変換するときに便利です。

Step 5:Contains で特定の値を含むかチェックする

例:CSVの中に「Tokyo」が含まれているか

CSVの中に特定の値が含まれているかを調べたいとき、 Contains を使うことができます。

using System;

class Program
{
    static void Main(string[] args)
    {
        string rawCsv = "Yamada, Taro, 30, Tokyo";

        string[] fields = rawCsv.Split(',');

        // 各フィールドを Trim
        for (int i = 0; i < fields.Length; i++)
        {
            fields[i] = fields[i].Trim();
        }

        bool hasTokyo = false;

        foreach (string field in fields)
        {
            if (field.Contains("Tokyo"))
            {
                hasTokyo = true;
                break;
            }
        }

        Console.WriteLine($"この CSV に \"Tokyo\" を含むフィールドがある?: {hasTokyo}");

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Contains は「部分文字列が含まれているか」を調べます。
  • CSVの中から特定の値を含むレコードだけを抽出したいときに役立ちます。

Step 6:StartsWith / EndsWith でパターンを判定する

例:IDフィールドや拡張子フィールドの判定

CSVの中に、

  • 先頭が "ID-" で始まるフィールド
  • 末尾が ".jp" で終わるドメイン名

などが含まれている場合、StartsWithEndsWith が役立ちます。

using System;

class Program
{
    static void Main(string[] args)
    {
        // 例:ID, 名前, メールアドレス の CSV
        string rawCsv = "ID-001, Yamada Taro, taro@example.jp";

        string[] fields = rawCsv.Split(',');

        for (int i = 0; i < fields.Length; i++)
        {
            fields[i] = fields[i].Trim();
        }

        string id = fields[0];
        string name = fields[1];
        string email = fields[2];

        Console.WriteLine($"ID:    {id}");
        Console.WriteLine($"名前:  {name}");
        Console.WriteLine($"メール:{email}");

        // ID が "ID-" で始まるか
        if (id.StartsWith("ID-"))
        {
            Console.WriteLine("→ ID フィールドは正しい形式です。");
        }

        // メールアドレスが ".jp" で終わるか
        if (email.EndsWith(".jp"))
        {
            Console.WriteLine("→ 日本のドメインのメールアドレスです。");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • StartsWith は「接頭辞」、EndsWith は「接尾辞」のチェックに使います。
  • CSVの特定フィールドの形式チェックに非常に有用です。

ミニ課題完成版:CSV 1 行を解析・整形するコンソールプログラム

すべてのメソッドを組み合わせた実践例

最後に、Day 25 のメソッドを総合的に使った 「CSV形式の文字列を分解・解析・整形する」ミニ課題の完成版を示します。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("CSV形式の1行を入力してください。");
        Console.WriteLine("例:  Yamada, Taro, 30, Tokyo");
        Console.Write("入力: ");

        string? input = Console.ReadLine();

        if (string.IsNullOrWhiteSpace(input))
        {
            Console.WriteLine("入力が空です。終了します。");
            return;
        }

        // Step 1: 全体を Trim
        string trimmedCsv = input.Trim();

        // Step 2: Split でカンマ区切りに分解
        string[] fields = trimmedCsv.Split(',');

        // Step 3: 各フィールドを Trim して整形
        for (int i = 0; i < fields.Length; i++)
        {
            fields[i] = fields[i].Trim();
        }

        Console.WriteLine("\n=== 分解結果 ===");
        for (int i = 0; i < fields.Length; i++)
        {
            Console.WriteLine($"fields[{i}] = \"{fields[i]}\"");
        }

        // Step 4: Replace の例("Tokyo" を "東京都" に変換)
        for (int i = 0; i < fields.Length; i++)
        {
            fields[i] = fields[i].Replace("Tokyo", "東京都");
        }

        // Step 5: Contains の例("@" を含むフィールドをメール候補とみなす)
        Console.WriteLine("\n=== メールアドレス候補のチェック ===");
        foreach (string field in fields)
        {
            if (field.Contains("@"))
            {
                Console.WriteLine($"メール候補: {field}");
            }
        }

        // Step 6: StartsWith / EndsWith の例
        Console.WriteLine("\n=== ID とドメインのチェック ===");
        foreach (string field in fields)
        {
            if (field.StartsWith("ID-"))
            {
                Console.WriteLine($"IDフィールド: {field}");
            }

            if (field.EndsWith(".jp"))
            {
                Console.WriteLine($"日本ドメインのメールまたはURL: {field}");
            }
        }

        // Step 7: Join で整形済み CSV を再出力
        string normalizedCsv = string.Join(", ", fields);

        Console.WriteLine("\n=== 整形済み CSV ===");
        Console.WriteLine(normalizedCsv);

        Console.ReadLine();
    }
}
C#

この完成版で体験できること:

  • TrimSplit → 各フィールド TrimReplaceContainsStartsWith / EndsWithJoin という一連の文字列処理の流れ
  • CSV 1 行を「分解して意味を取り出し、整形して再出力する」実践的な処理

Day 25 ミニ課題のまとめ

このミニ課題では、

  • CSV形式の文字列を TrimSplit で分解する
  • 各フィールドを TrimReplace で整形する
  • ContainsStartsWithEndsWith で内容を判定する
  • Join で整形済みデータを再び CSV 形式にまとめる

という流れで、文字列操作メソッドを実践的な CSV 処理に結びつけて学びました

CSVは、ログ・設定・インポート/エクスポートなど、 多くの場面で使われるフォーマットです。

ぜひ、

  • フィールド数が増えた CSV を扱ってみる
  • 数値フィールドを int.Parsedouble.Parse で数値に変換してみる
  • 複数行の CSV を Split('\n') で行ごとに分解して処理してみる

といったアレンジを加えながら、 文字列操作とデータ処理の感覚を少しずつ広げていってください。

タイトルとURLをコピーしました