やまちゃんのオーディオブログ

真空管アンプ、最近は資金調達のためのFX,MetaTrader4ネタもやっています。

C#

C#: iniファイルの読み出しと編集(重複する値、キーがあるとき)

投稿日:

C#では iniファイルの読み出し用のプロパティが設けられているが、
キーと値が1対1でなければならず、値が複数の場合には登録できない。
そこで、例えば、以下のような音楽ファイルの存在するフォルダを複数登録することはむつかしい。

#キー1
abcd=1
abcd=2
abcd=3
abc
#音楽フォルダ
/abc/abc
/abc
/abc

このような場合、#以下をキー1、”=”の前をキー2、”=”の後をバリューなどにして、クラスの配列にする。
Cでいう構造体(データのセット)を配列化するようなイメージである。2次元配列でも構わない。
クラスは以下のようなものを考える。

public class ini_struct
{
public string keyandvalue0 {set;get;}
public string keyandvalue1 {set;get;}
public string keyandvalue2 {set;get;}
}

これはデータセットの設計図で、これを具体的にメモリに領域確保するには、

ini_struct[] ini_st= new ini_struct[3]();

で、インスタンス化(具体化、製品化)する。newを用いて、いくらでも新しい領域確保ができる。
ここで、「3」は配列の要素数で、配列ではあらかじめ要素数を定める必要がある。
例えば、2番目の#の要素の音楽フォルダを取り出すには、ini_struct[1].keyandvalue1として、
クラスの要素を取り出す。
iniファイルを読み出し、データセットを格納するには、#が存在する行をとらえて、新しいkeyandvalue0 を設定し、
=が存在する場合には、”=”より前を、keyandvalue1に登録する。

ini_struct[j].keyandvalue1=「イコールの前の文字列、ただし、トリム済み」

とする。
=が存在しない場合には、以下のようにする。

ini_struct[j].keyandvalue1=「一行の文字列」

また、”=”より後を、keyandvalue2に登録する。

もっとも、配列の大きさがわからないときは、Listを使う。
上記のデータセットを、複数組み合わせたリストを作成する。
List ini =new List();
として、領域確保。上記と同様にして、

ini_struct[j].keyandvalue1=読み取った文字列の#より後ろの文字列;

という風に順繰り文字列を登録していく。

#以下のキーに応じたデータセットの集合を取り出すのは、LinQを使わなくても、FindAllを使えば足りる。

var selected_list= ini_struct.FindAll( s => s.keyandvalue1 =”キー1″);

ここで、sは、リストの抽出に使うラムダ式のようであるが、とりあえずこれだけを覚えておけば、データセットから必要なものを選択して取り出せる。
例えば、実装するなら、以下のプログラム。

public class data_set
{
public string key_and_value0 { get; set; }
public string key_and_value1 { get; set; }
public string key_and_value2 { get; set; }
public static List ListSelect(List parent_list, string keyword)
{
List selected_data = parent_list.FindAll(s => s.key_and_value0 == keyword);
return selected_data;
}
     }

この関数はクラスのリストを返す。
linqをネット検索をすると、数字の抽出のみを紹介するサイトが多くて困った。
データの情報はほとんどが文字列だから、上記の関数を使えば足りる。
分からなくて、本を買ってしまったが、これだけでほとんど事足りる。

-C#

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

no image

C#:Listのaddが思い通りいかないときは・・・参照渡しのいたずら

それから、①文字列のリストと、②文字列配列のリストと、③クラスのリストは、決定的に違うのは、 ①は、文字列が値渡しであるのに、②、③は値が格納されている場所を返す参照渡しという点である。 ②、③をルー …

no image

C# XamarinでC# 日本語入力

C#で、コンソール型のラズパイ用のプレーヤーのプログラムを書いている。 コンソール上で、ファイルを選択したり、 コンソール型の例えばaplayなどのプレーヤーで、ファイルに応じて特定のコマンドを作成し …

[最近の記事]
2018年6月
 12
3456789
10111213141516
17181920212223
24252627282930