2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[C#] 文字列操作

Last updated at Posted at 2017-03-13

関連記事 : http://qiita.com/muzudho1/items/75eac9fea27d64ce856e

コマンドライン引数 args

using System;

class Study_cs
{
    static void Main(string[] args)
    {
        Console.WriteLine("args.Length=[" + args.Length + "]");
        int i = 0;
        foreach (string arg in args)
        {
            Console.WriteLine("(" + i + ")arg=[" + arg + "]");
            i++;
        }

        Console.WriteLine("Please, push any key.");
        Console.ReadKey();
    }
}

(Visual Studio 2015)
このまま実行すると、

// 結果:
// args.Length=[0]

(Ubuntu16.04)

mcs study_cs.cs
./study_cs.exe
args.Length=[0]
Please, push any key.

引数を与えて実行すると

./study_cs.exe -a --bcde > ./study_cs.out.log 2> ./study_cs.err.log

標準出力に結果は返ってこないので、ファイルを見に行く。

nano study_cs.out.log

study_cs.out.log

args.Length=[2]
(0)arg=[-a]
(1)arg=[--bcde]
Please, push any key.

空白区切りでトークンを取ってくれるようだ。
もう少し調べてみた。

./study_cs.exe -a b c d --efg  -h  i > ./study_cs.out.log 2> ./study_cs.err.log

半角スペース2個で区切る例も試してみた。

args.Length=[7]
(0)arg=[-a]
(1)arg=[b]
(2)arg=[c]
(3)arg=[d]
(4)arg=[--efg]
(5)arg=[-h]
(6)arg=[i]
Please, push any key.

文字列分割 半角スペース区切り

単純に半角スペースで区切ると

using System;

class Study_cs
{
    static void Main(string[] args)
    {
        string[] a = "あい う えお  か   き    く     けこ".Split(' ');

        Console.WriteLine("a.Length=[" + a.Length + "]");
        int i = 0;
        foreach (string b in a)
        {
            Console.WriteLine("(" + i + ")b=[" + b + "]");
            i++;
        }

        Console.WriteLine("Please, push any key.");
        Console.ReadKey();
    }
}

こうなってしまう。

a.Length=[17]
(0)b=[あい]
(1)b=[う]
(2)b=[えお]
(3)b=[]
(4)b=[か]
(5)b=[]
(6)b=[]
(7)b=[き]
(8)b=[]
(9)b=[]
(10)b=[]
(11)b=[く]
(12)b=[]
(13)b=[]
(14)b=[]
(15)b=[]
(16)b=[けこ]
Please, push any key.

(Visual Studio 2015)

連続する半角スペースも1個と考えたいことがあるだろう。その場合、正規表現を使う。

using System;
using System.Text.RegularExpressions;

class Study_cs
{
    static void Main(string[] args)
    {
        string[] a = Regex.Replace("あい う えお  か   き    く     けこ"," +"," ").Split();

        Console.WriteLine("a.Length=[" + a.Length + "]");
        int i = 0;
        foreach (string b in a)
        {
            Console.WriteLine("(" + i + ")b=[" + b + "]");
            i++;
        }

        Console.WriteLine("Please, push any key.");
        Console.ReadKey();
    }
}

結果

// 結果:
a.Length=[7]
(0)b=[あい]
(1)b=[う]
(2)b=[えお]
(3)b=[か]
(4)b=[き]
(5)b=[く]
(6)b=[けこ]
Please, push any key.

(Visual Studio 2015)

楽しいサンプル・プログラム

解析器

using System;
using System.Text.RegularExpressions;
// ↑ファイルの冒頭に書く
// 与件
string[] data = Regex.Replace("成績 安蘇 95 伊能 88 宇野 75 江田 77 隠岐 100", " +"," ").Split();

// 受け皿
const int NUM = 10;
string[] names = new string[NUM]; // 結果はこれらの配列に入れる。領域は多めに取っておく
string[] scores = new string[NUM];

// 解析器
int m0 = 0; // 記憶0 : データの種類 : 0ニュートラル 1成績
int m1 = 0; // 記憶1 : データの列   : (条件)m0==1成績 : 0氏名 1点数
foreach (string a in data)
{
    switch (m0)
    {
        case 0: // ニュートラル
            switch (a)
            {
                case "成績": m0 = 1; break;
            }
            break;
        case 1: // 成績
            switch (m1%2)
            {
                case 0: names[m1 / 2] = a; m1++; break;
                case 1: scores[m1 / 2] = a; m1++; break;
            }
            break;
    }
}

// 出力
Console.WriteLine("成績発表");
for (int i = 0; i < NUM; i++)
{
    Console.WriteLine(names[i] + "=" + scores[i]);
}

Console.WriteLine("Please, push any key.");
Console.ReadKey();
// 結果:
成績発表
安蘇=95
伊能=88
宇野=75
江田=77
隠岐=100
=
=
=
=
=
Please, push any key.

(Visual Studio 2015)

解説

人の感覚で

  • ペア になっている
  • ひとかたまり になっている

というものは、周期として捉える。例) アニメの1クール

例えば 13話 1クール なら

num%13

と書けば、0~12、0~12 と繰り返す。
結果を 1~13 にしたい場合は +1 するといい。(オフセット)

num%13+1

読取位置を調整するときも足し算すればいい。(オフセット)

(num+10)%13

何クール目かを調べたいときは割り算が使える。

num/13

これも 0 スタートになるので、1スタートにしたい場合は +1 する。

次のようにも書くことができる。スタティックな書き方。

using System;
using System.Text.RegularExpressions;
// ↑ファイルの冒頭に書く
// 与件
string[] data = Regex.Replace("成績 安蘇 95 伊能 88 宇野 75 江田 77 隠岐 100", " +"," ").Split();
// 先頭はデータのタイトル。
// 以降、0氏名、1点数 の繰り返し

// 受け皿
const int NUM = 10;
string[] names = new string[NUM]; // 結果はこれらの配列に入れる。領域は多めに取っておく
string[] scores = new string[NUM];

// 解析器
int m = 0; // 記憶 : カーソル相当
foreach (string a in data)
{
    if (m==0) // ニュートラル
    {
        switch (a)
        {
            case "成績": m++; break;
        }
    }
    else // 成績
    {
        switch ((m - 1) % 2) // タイトル1列分引いて m-1 としている
        {
            case 0: names[(m - 1) / 2] = a; m++; break;
            case 1: scores[(m - 1) / 2] = a; m++; break;
        }
    }
}

// 結果
Console.WriteLine("成績発表");
for (int i = 0; i < NUM; i++)
{
    Console.WriteLine(names[i] + "=" + scores[i]);
}

利点 カーソルが1個 動いているだけ、という理解しやすさ
欠点 データを1列増やしたいときに アルゴリズムの変更箇所が比較的多くなる

データが可変長だった場合はどうだろうか?

using System; // Console
using System.Collections.Generic; // List<...>
using System.Text.RegularExpressions; // Regex
// ↑ファイルの冒頭に書く
// 与件
string[] data = Regex.Replace("--加納 こはだ かんぱち まぐろ --木曽 あなご かっぱ --久慈 たまご あかがい とろ いか", " +", " ").Split();
// 人物、寿司ネタは可変個数設定可能

// 受け皿
List<string> persons = new List<string>(); // 結果はこれらの配列に入れる
List <List<string>> dishes = new List<List<string>>();

// 記憶
// 別段用意無し

// 解析器
foreach (string a in data)
{
    if (a.StartsWith("--"))
    {
        persons.Add(a.Substring(2)); // 最初の2文字 -- の次から
        dishes.Add(new List<string>()); // リストの中にリストを準備
    }
    else { dishes[dishes.Count-1].Add(a); } // 要素数-1 で最後の要素
}

// 結果
int i = 0;
foreach (string person in persons)
{
    foreach(string dish in dishes[i])
    {
        Console.WriteLine("(" + i + ") person=[" + person + "] dish=[" + dish + "]");
    }
    i++;
}

Console.WriteLine("Please, push any key.");
Console.ReadKey();
return;
// 結果:
(0) person=[加納] dish=[こはだ]
(0) person=[加納] dish=[かんぱち]
(0) person=[加納] dish=[まぐろ]
(1) person=[木曽] dish=[あなご]
(1) person=[木曽] dish=[かっぱ]
(2) person=[久慈] dish=[たまご]
(2) person=[久慈] dish=[あかがい]
(2) person=[久慈] dish=[とろ]
(2) person=[久慈] dish=[いか]
Please, push any key.
2
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?