0

テキスト ファイルからキーと値のペアを解析しようとすると問題が発生します。これを実行できるクラスを作成する能力がないため、私は自分がやりたいことを実行できるライブラリを探しています。

これは、コメントアウトされたテキストとキーと値のペアの一部とともに、私のファイルの冒頭です。

#!version:1.0.0.1

##File header "#!version:1.0.0.1" can not be edited or deleted, and must be placed in the first line.##

#######################################################################################
##                           Account1 Basic Settings                                 ##       
#######################################################################################

account.1.enable = 1
account.1.label = Front
account.1.display_name = Front

私が探しているのは、これらの値を取得し、ファイル内の同じ場所にあるファイル内でそれらを更新できるようにすることです。これらのファイルは人間が読める状態にしておく必要があるためです。

このライブラリは私が望むことを実行できるように思われるため、Nini を調べましたが、引き続き発生するエラーは、キーと値のペアではないため、ファイルの行 1 に基づいています。

Expected assignment operator (=) - Line: 1, Position: 19.

Nini のソースを読んだところ、Mysqlstyle を使用するようにリーダーを条件付ける方法があり、「#」をコメントとして使用する方法があるようですが、それを調整する方法や、このまま自動的に行われるかどうかはわかりません。完全に私の頭の上。

私のファイルは正当な ini ファイルではなく、キーと値のペアが含まれるセクションを検索するため、Nini ライブラリ内におそらく制限があることを理解しています。

このテキストを解析して表示し、Nini で編集するために使用しようとしたコードは次のとおりです。

public void EditCFG(string file)
{
    if (!string.IsNullOrWhiteSpace(file))
    {
        IniConfigSource inifile = new IniConfigSource(file);
        account_1_display_name.Text = inifile.Configs[""].Get("account.1.display.name");
    }
}

誰かが私を正しい方向に向けてもらえますか?

編集

@rowland-shaw のおかげで、解決策が見つかりました。

    private IConfigSource source = null;

    public void EditCFG(string file)
    {
        if (!string.IsNullOrWhiteSpace(file))
        {
            IniDocument inifile = new IniDocument(file, IniFileType.MysqlStyle);
            source = new IniConfigSource(inifile);
            account_1_display_name.Text = source.Configs["account"].Get("account.1.display_name");
        }
    }

しかし、これは完全な答えではありませんでした。ファイル内にセクションも実装する必要がありました。更新されたテキストでこれらのファイルを取得する私の機器をテストした後、すべてが成功しました。

4

3 に答える 3

0

それがkey = valueファイル内の形式(コメントの場合は # )になる場合は、次のようにすることができます(c#疑似コードっぽい、簡単なことを自分で行うことができます):

Dictionary<string, string> dictionary;
foreach(string line in file)
{
    if(string.IsNullOrWhiteSpace(line)) continue;

    // Remove extra spaces
    line = line.Trim();
    if(line[0] == '#') continue;

    string[] kvp = line.Split('=');
    dictionary[kvp[0].Trim()] = kvp[1].Trim(); // kvp[0] = key, kvp[1] = value
}

次に、作成した辞書を次のように使用できますaccount_1_display_name.Text = dictionary["account.1.display.name"];

于 2016-01-06T17:23:34.293 に答える