解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

C# で ASCII 文字列をソートすると良いことがありそうか確認した



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


テキストを行単位で配列に格納して、 for ループで配列を検索していると、どうしても大容量データだと時間がかかります。

使える時は限定的になりますが、ソートを活用して検索したい配列をひとかたまりにしてしまえば、処理の時間が削減できる気がしたので、とりあえず、 ASCII 文字列をソートした時の並び順を確認することにしました。



動作環境


Windows 7
Visual Studio 2017



プログラム

ASCII 文字列を昇順と降順にソートして、ファイルに出力する C#ソースコードを書きました。

ソースコード


using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Sort_ASCII
{
    class Program
    {
        static void Main(string[] args)
        {
            // 出力用ディレクトリ
            string sDir = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
 
            // 出力用変数
            string originASCII = "";
            string ascendingASCII = "";
            string descendingASCII = "";
 
            // 印字可能な ASCII 文字列配列作成
            string[] ASCII = new string[] { " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~" };
 
            for(int i=0; i < ASCII.Length; i++)
            {
                originASCII += string.Format("{0,3}", ASCII[i]);
            }
 
            // 昇順ソート
            Array.Sort(ASCII);
 
            for (int i = 0; i < ASCII.Length; i++)
            {
                ascendingASCII += string.Format("{0,3}", ASCII[i]);
            }
 
            // 降順ソート
            Array.Reverse(ASCII);
 
            for (int i = 0; i < ASCII.Length; i++)
            {
                descendingASCII += string.Format("{0,3}", ASCII[i]);
            }
 
            // 出力
            File.WriteAllText(sDir + "\\" + "Sort-ASCII.txt", originASCII);
            File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", Environment.NewLine);
            File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", ascendingASCII);
            File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", Environment.NewLine);
            File.AppendAllText(sDir + "\\" + "Sort-ASCII.txt", descendingASCII);
        }
    }
}



結果

結果は図1 の通りとなりました。
上段、中段、下段の内容はそれぞれ以下の通りです。
上段:初期の並び順
中段:昇順
下段:降順

横長になってしまったので、スクロールできるようにしました。


     !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  {  |  }  ~
  '  -     !  "  #  $  %  &  (  )  *  ,  .  /  :  ;  ?  @  [  ]  ^  _  `  {  |  }  ~  \  +  <  =  >  0  1  2  3  4  5  6  7  8  9  a  A  b  B  c  C  d  D  e  E  f  F  g  G  h  H  i  I  j  J  k  K  l  L  m  M  n  N  o  O  p  P  q  Q  r  R  s  S  t  T  u  U  v  V  w  W  x  X  y  Y  z  Z
  Z  z  Y  y  X  x  W  w  V  v  U  u  T  t  S  s  R  r  Q  q  P  p  O  o  N  n  M  m  L  l  K  k  J  j  I  i  H  h  G  g  F  f  E  e  D  d  C  c  B  b  A  a  9  8  7  6  5  4  3  2  1  0  >  =  <  +  \  ~  }  |  {  `  _  ^  ]  [  @  ?  ;  :  /  .  ,  *  )  (  &  %  $  #  "  !     -  '
図1 図



コメント

このソースコードを流用することはないと思いますが、 ASCII の昇順、降順で並び順の変わり方が分かりました。

A B C などのアルファベットの並び順はおいといて、 @ や & 、 $ といった文字は覚えておいても良いでしょう。

決まった書式で書かれた文字列配列から、先頭が @ から始まる文字列だけを抽出する場合などはソートしてから検索して、 @ が検出されなくなったら、ループ脱出すれば、無駄なループを待つ必要がなくなります。

ただし、ファイル入力時間、ソート時間を考慮すると意味が無いかもしれません。



以上