- Day 25 のゴールと全体像
- Trim:前後の空白を取り除く
- Split:文字列を分割する
- Join:配列を 1 つの文字列にまとめる
- Replace:文字列の一部を置き換える
- Contains:部分文字列が含まれているか調べる
- StartsWith:指定した文字列で始まっているか
- EndsWith:指定した文字列で終わっているか
- 総合例:ユーザー入力を解析するミニ処理
- Day 25 のまとめ
- Day 25 ミニ課題のゴールと全体像
- CSV形式の文字列とは何か
- Step 1:Trim で前後の余計な空白を取り除く
- Step 2:Split で CSV を配列に分解する
- Step 3:Join で配列を再び CSV に戻す
- Step 4:Replace でフィールドの内容を置き換える
- Step 5:Contains で特定の値を含むかチェックする
- Step 6:StartsWith / EndsWith でパターンを判定する
- ミニ課題完成版:CSV 1 行を解析・整形するコンソールプログラム
- Day 25 ミニ課題のまとめ
Day 25 のゴールと全体像
Day 25 では、C# の文字列操作を一気に実践レベルまで引き上げることを目標にします。 扱うメソッドは次の 7 つです。
TrimSplitJoinReplaceContainsStartsWithEndsWith
これらは、入力チェック・ログ解析・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で拡張子を判定し、Contains・StartsWithで名前のパターンをチェックする実践的な使い方
Day 25 のまとめ
Day 25 では、文字列操作の実践的なメソッドをまとめて学びました。
Trim:前後の空白を取り除くSplit:区切り文字で分割して配列にするJoin:配列を区切り文字で結合して 1 つの文字列にするReplace:文字列の一部を別の文字列に置き換えるContains:部分文字列が含まれているか調べるStartsWith:指定した文字列で始まっているか調べるEndsWith:指定した文字列で終わっているか調べる
これらは、
「文字列をきれいに整える」「文字列から意味を取り出す」
ための基本ツールです。
ぜひ、
- ログの1行を
Splitして解析してみる - ユーザー入力を
Trimしてからチェックする - ファイル一覧から特定の拡張子だけを
EndsWithで抽出する
といった小さな練習を積み重ねながら、 文字列操作を「怖いもの」ではなく「頼れる道具」として使いこなしていってください。
Day 25 ミニ課題のゴールと全体像
Day 25 のミニ課題では、CSV形式の文字列を分解・加工する処理を作ることを目標にします。 CSVは「カンマ区切りのテキスト」で、現場のシステムでも非常によく使われる形式です。
ここでは、
- 1行の CSV 文字列を
TrimとSplitで「きれいに分解」する - 分解したデータを
Joinで再び CSV 形式に戻す Replace・Contains・StartsWith・EndsWithを組み合わせて、 文字列の内容をチェック・加工する
という流れで、ステップバイステップで解説していきます。
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"で終わるドメイン名
などが含まれている場合、StartsWith・EndsWith が役立ちます。
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#この完成版で体験できること:
Trim→Split→ 各フィールドTrim→Replace→Contains→StartsWith/EndsWith→Joinという一連の文字列処理の流れ- CSV 1 行を「分解して意味を取り出し、整形して再出力する」実践的な処理
Day 25 ミニ課題のまとめ
このミニ課題では、
- CSV形式の文字列を
TrimとSplitで分解する - 各フィールドを
Trim・Replaceで整形する Contains・StartsWith・EndsWithで内容を判定するJoinで整形済みデータを再び CSV 形式にまとめる
という流れで、文字列操作メソッドを実践的な CSV 処理に結びつけて学びました。
CSVは、ログ・設定・インポート/エクスポートなど、 多くの場面で使われるフォーマットです。
ぜひ、
- フィールド数が増えた CSV を扱ってみる
- 数値フィールドを
int.Parseやdouble.Parseで数値に変換してみる - 複数行の CSV を
Split('\n')で行ごとに分解して処理してみる
といったアレンジを加えながら、 文字列操作とデータ処理の感覚を少しずつ広げていってください。
