#うわ、定義データが全部CSVファイルだ。
Exelなどで定義され出力されたファイルによって、WinFormsで扱いたいデータがcsv形式ということが多々ありました。csvを読み込みそのまま扱うこともできますが、数百から数千あるとxmlで生成しておく方がC#のlinqで恩恵を受けやすく操作が簡単かと思いました。今回はcsvを読み込みxmlとして生成→定義しlinqで簡単にデータを扱っていきます。
#csvからxml
例ですが、対象のcsvファイルは以下のようになっているとします。
1番目の要素は男性ID、2番目の要素は女性ID、3番目は出力文章です。
1,25,This season's anime is abundant,
2,26,I eat jam bread every day,
....続く
これらのcsvファイルをxmlに変換していきます。
using System.Xml.Linq
string[] csvfile = File.ReadAllLines("english.csv");
XElement parent = new XElement("EngishConfigs",
from str in csvfile
let items = str.Split(',')
select new XElement("EnglishConfig",
new XElement("ManID", items[0]),
new XElement("WomanID", items[1]),
new XElement("Sentence", items[2])
)
);
parent.Save("English.xml")
とすると以下のようにxmlファイルが生成されます。
<EngishConfigs>
<EnglishConfig>
<ManID>1</ManID>
<WomanID>25</WomanID>
<Sentence>This season's anime is abundant</Sentence>
</EnglishConfig>
<EnglishConfig>
<ManID>2</ManID>
.....続く
</EngishConfigs>
#XMLファイルをLINQで扱う
csvからXMLを生成したところで、これらの定義ファイルをLINQを使って操作していきたいと思います。今回のケースとしては、受信したデータや条件判定されたID(男性または女性)の値から出力する文章を取得し扱う。というケースでいきます。
var xelm = XElement.Load( @"C:\Gomibako\English.xml" );
var emp = (
from p in xelm.Elements( "EnglishConfig" )
where p.Element( "ManID" ).Value == "条件から取得した値" ||
p.Element( "WomanID" ).Value == "条件から取得した値"
select p ).Single();
MessageBox.Show( emp.Element( "Sentence" ).Value );
#まとめ
このようにcsvからXMLファイルとして定義しておくことで、LINQの恩恵によりデータを扱いやすくなりました。今回は紹介しませんでしたが、LINQでXMLを操作することで、複数要素の選択や集計した値、ソートなど様々な関数が使えるみたいでC#のLINQ最高ですね。これらのデータを保持しておく方法は他にも多々あるかと思いますが、数千行ある情報をコピペでxmlファイルにコピペしている人を目撃したので、今回はその代用としてこの方法を使いました。