ナルシーNote

2020年12月からC#、2021年2月からPythonを51歳で始めました。学んだことを備忘録として残してます。そろそろN88BASICは卒業しようかな😱

<C#>”Key = Value"みたいな設定ファイルを読み込む

設定ファイルを読み込むサンプルです。

テキストファイルをディクショナリに入れて変数のように使用してみました。

'設定ファイルのサンプル
りんご="apple"'ダブルクオートはあってもなくても可
ばなな	= banana'こめんと
Key	= Value	'Keyの大文字小文字は同一視

こちらがコードです。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace NarcyNote
{
    class ClassSettings
    {
        // 設定を入れておくDictionary
        public Dictionary<string, string> Settings = 
            new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);

        public string Setting(string skey)
        {
            // 設定されてない時は""を返す
            if (Settings.ContainsKey(skey))
            {
                return Settings[skey];
            }
            else
            {
                return "";
            }
        }

        public bool LoadSettings(string filename)
        {
            //設定ファイルをDictionaryに入れる

            string fullPath = Path.Combine(
                AppDomain.CurrentDomain.SetupInformation.ApplicationBase, filename);

            //ファイルを読み込む
            string sAllData = "";
            if (!LoadFile(fullPath, ref sAllData))
            {
                Console.WriteLine("LoadSettings失敗:" + fullPath);
                return false;
            }

            //設定をDictionaryに入れる
            string[] sLines = sAllData.Split(new string[] { "\r\n" }, StringSplitOptions.None);
            foreach (var sLine in sLines)
            {
                var sBuf = sLine.Replace("\t", "");                 // TAB削除
                if (sBuf.IndexOf("'") > -1)
                {
                    sBuf = sBuf.Substring(0, sBuf.IndexOf("'"));    // コメント削除
                }
                if ((sBuf.Length > 0) && (sBuf.IndexOf("=") > -1))  // 設定行?
                {
                    string[] sValues = sBuf.Split('=');
                    sValues[0] = sValues[0].Trim();
                    sValues[1] = sValues[1].Trim();

                    var sepaSemicolons = sValues[1].Split(';');
                    foreach (var sepaSemicolon in sepaSemicolons)
                    {
                        var addValue = sepaSemicolon.Trim();
                        
                        if (addValue.Contains("\""))    // ダブルクオート削除
                        {
                            addValue = addValue.Replace("\"", string.Empty);
                        }
                        if (!Settings.ContainsKey(sValues[0]))  
                        {
                            Settings.Add(sValues[0], addValue); // 初登録
                        }
                        else 
                        {
                            // 既にあるときは改行区切りで追加
                            Settings[sValues[0]] =
                                Settings[sValues[0]] + "\r\n" + addValue;
                        }
                    }
                }
            }
            return true;
        }

        public static bool LoadFile(string filename, ref string file2str)
        {
            //テキストファイルを変数に入れる

            file2str = "";
            StreamReader sr = null;
            try
            {
                var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                sr = new StreamReader(fs, Encoding.GetEncoding("UTF-8"));
                file2str = sr.ReadToEnd();

            }
            catch 
            {
                Console.WriteLine("LoadFile失敗:" + filename);
                return false;
            }
            finally
            {
                if (sr != null)
                {
                    sr.Close();
                }
            }
            return true;
        }
    }
}

 

ご使用に関しては自己責任でよろしくお願い申し上げます。

2020年12月にpaizaラーニングでC#を受講しました。

コメントでアドバイスをいただけると幸いです。

 

ほしい物リスト

ナルシーのほしい物リストはこちら