設定ファイルの読み込み方法

最近シノアリスをはまってないけど頑張ってます

正直色々ガバガバでこのゲーム大丈夫か?って思いながらプレイしてます。


今日は設定ファイルの読み込みについて書こうと思います(自分のための覚え書きです)

結論から言うと正規表現を使おうってことです。
でも、正規表現の説明をしているサイトなんて無限にあるので雑にこんなこと出来るよくらいで書いてみます。

プログラムを書いていると設定ファイルを使うことが多々ありますが自分でフォーマット決めてかけるようにするとき順不同にするために

設定項目名1:値1
設定項目名2:値2

的な仕様にしていて、今までは読み込むときに

var sr = new StreamReader("[パス]");
string line = "";
while(!sr.EndOfStream){
 line=sr.ReadLine();
 if(line.contains("[設定項目名1]")){
  //処理
 }else if(line.contains("[設定項目名2]")){
  //処理
 }
}

見たいに書いてました。

この方法だと設定項目名と同じ値は必ず使えないという縛りがありました。

他にも値を取り出すときに

line.Split(':');

で取りだしていたのですが値に':'があると分解されるという問題もありました。
(これに関しては取り出し方を変えればいいだけですが)

より見やすく簡単にするために正規表現を使ってみます

var sr = new StreamReader("[パス]");
var lines = "";
while(!sr.EndOfStream)lines+=sr.ReadLine();
Regex r = new Regex("[設定項目名1].*\n",RegexOptions.Singleline);
Match m = r.Match(lines);
if(m.success){
 //処理(m.Valueで対象の値が使える)
}
r=new Regex("[設定項目名2].*\n");
Match m = r.Match(lines);
if(m.success){
 //処理(m.Valueで対象の値が使える)
}

といった感じになるかなと思います。

正規表現についての詳しい解説は他のサイトがいくつも行っているので省略します。

"folder"で指定されたフォルダ内の画像のリスト(例としてjpg,bmp,png)が欲しければ下のような感じになるかと思います。

設定ファイル(setting.txt)
//folderはいくつも指定可能
folder:C:\Picture
folder:C:\Photo
ソースコード
using System;
using System.Linq;
using System.IO;
using System.Text.RegularExpressions;
class Example{
 static void Main(string[] args){
  StreamReader sr = new StreamReader("./setting.txt");//設定ファイルがプログラムと同位置にあるという過程
 string line = "", all_lines = "";
  while(!sr.EndOfStream){
   line = sr.ReadLine(); 
   //設定ファイルでコメントアウトを使う場合
   if(line.Substring(0,2).Equals("//"))continue;
   all_lines += line+"\n";
 }
  //正規表現のパターンと改行で切って比較するかどうかの設定
  Regex r = new Regex("folder:.+",RegexOptions.Multiline);
  //folder:で始まる行のみを抽出してmatchesに格納
  var matches = r.Matches(all_lines);
  foreach (var value in matches)
  {
   //フォルダ内のファイルリスト取得
   var folder = Directory.GetFiles(value.ToString().Replace("folder:", "").Replace("\n", ""));
   //jpg,png,bmp拡張子のみを抽出
   var files = folder.Where(x => x.Contains(".jpg") || x.Contains(".png") || x.Contains(".bmp"));
   //コンソールに表示
   foreach (var a in files) Console.WriteLine(a);
  }
 }
}
実行結果

f:id:bluetiger_ts:20170619154720p:plain

上の抽象的な例では設定項目が1つ以下であるという体で書いていたのでMatchを利用し、successで該当部分があったかどうかを判別しました。
下の例ではfolderが2つ3つ指定されている可能性があるためMatchesメソッドで該当部分を全て挙げました。
そのため、少しソースが変わっています。

正規表現は便利なのでもっと使っていきたい

はじめました

はじめまして(?)

 

何度もブログをやろうとしては三日坊主で終わっている私です。

 

今度こそ頑張りたい。

 

最初ということで今後書きそうなことをまとめてみようと思います。

 

・日常

日常と一言で言っても色々あるわけでこの後あげるようなことも日常に含まれたりしそうですが(ゲームとか)その日あったことをまとめることも多そう

 

・ゲーム

そこそこの比重を占めそうです。

今のとこだと

FGO

・PUBG

・FFTCG

辺りが多そうです

 

・プログラミング

これはメモ代わりに書くことが多そう

いつも使うわけではないけどたまに使うことはすぐ思い出せるほうが便利です

C#

・Unity

辺りが多そう

 

頑張ります