INI形式のファイルを読む 最終更新日 2013年3月28日 1:39 INI形式のファイルを読み込み、読み込んだセクション・キー・値を一覧にして表示する例。 ここで紹介する実装では、INI形式の解析に正規表現を使う。 また、'#' および ';' で始まる行、および各行の ';' 以降をコメントとして扱う。 C# VB INI形式のファイルを読む 別ウィンドウで開く すべて選択してコピー ダウンロード 行番号を表示する using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; class Sample { static void Main() { const string iniFile = @"test.ini"; // INIファイルを読み込み、各セクション毎に表示する foreach (var section in ReadIni(iniFile)) { Console.WriteLine("[{0}]", section.Key); foreach (var pair in section.Value) { Console.WriteLine(" <{0}>='{1}'", pair.Key, pair.Value); } } } private static Dictionary<string, Dictionary<string, string>> ReadIni(string file) { using (var reader = new StreamReader(file)) { var sections = new Dictionary<string, Dictionary<string, string>>(StringComparer.Ordinal); var regexSection = new Regex(@"^\s*\[(?<section>[^\]]+)\].*$", RegexOptions.Singleline | RegexOptions.CultureInvariant); var regexNameValue = new Regex(@"^\s*(?<name>[^=]+)=(?<value>.*?)(\s+;(?<comment>.*))?$", RegexOptions.Singleline | RegexOptions.CultureInvariant); var currentSection = string.Empty; // セクション名が明示されていない先頭部分のセクション名を""として扱う sections[string.Empty] = new Dictionary<string, string>(); for (;;) { var line = reader.ReadLine(); if (line == null) break; // 空行は読み飛ばす if (line.Length == 0) continue; // コメント行は読み飛ばす if (line.StartsWith(";", StringComparison.Ordinal)) continue; else if (line.StartsWith("#", StringComparison.Ordinal)) continue; var matchNameValue = regexNameValue.Match(line); if (matchNameValue.Success) { // name=valueの行 sections[currentSection][matchNameValue.Groups["name"].Value.Trim()] = matchNameValue.Groups["value"].Value.Trim(); continue; } var matchSection = regexSection.Match(line); if (matchSection.Success) { // [section]の行 currentSection = matchSection.Groups["section"].Value; if (!sections.ContainsKey(currentSection)) sections[currentSection] = new Dictionary<string, string>(); continue; } } return sections; } } } INI形式のファイルを読む 別ウィンドウで開く すべて選択してコピー ダウンロード 行番号を表示する Imports System Imports System.Collections.Generic Imports System.IO Imports System.Text.RegularExpressions Class Sample Shared Sub Main() Const iniFile As String = "test.ini" ' INIファイルを読み込み、各セクション毎に表示する For Each section As KeyValuePair(Of String, Dictionary(Of String, String)) In ReadIni(iniFile) Console.WriteLine("[{0}]", section.Key) For Each pair As KeyValuePair(Of String, String) In section.Value Console.WriteLine(" <{0}>='{1}'", pair.Key, pair.Value) Next Next End Sub Private Shared Function ReadIni(ByVal file As String) As Dictionary(Of String, Dictionary(Of String, String)) Using reader As New StreamReader(file) Dim sections As New Dictionary(Of String, Dictionary(Of String, String))(StringComparer.Ordinal) Dim regexSection As New Regex("^\s*\[(?<section>[^\]]+)\].*$", RegexOptions.Singleline Or RegexOptions.CultureInvariant) Dim regexNameValue As New Regex("^\s*(?<name>[^=]+)=(?<value>.*?)(\s+;(?<comment>.*))?$", RegexOptions.Singleline Or RegexOptions.CultureInvariant) Dim currentSection As String = String.Empty ' セクション名が明示されていない先頭部分のセクション名を""として扱う sections(String.Empty) = New Dictionary(Of String, String)() While True Dim line As String = reader.ReadLine() If line Is Nothing Then Exit While ' 空行は読み飛ばす If line.Length = 0 Then Continue While ' コメント行は読み飛ばす If line.StartsWith(";", StringComparison.Ordinal) Then Continue While Else If line.StartsWith("#", StringComparison.Ordinal) Then Continue While End If Dim matchNameValue As Match = regexNameValue.Match(line) If matchNameValue.Success Then ' name=valueの行 sections(currentSection)(matchNameValue.Groups("name").Value.Trim()) = matchNameValue.Groups("value").Value.Trim() Continue While End If Dim matchSection As Match = regexSection.Match(line) If matchSection.Success Then ' [section]の行 currentSection = matchSection.Groups("section").Value If Not sections.ContainsKey(currentSection) Then sections(currentSection) = New Dictionary(Of String, String)() End If Continue While End If End While Return sections End Using End Function End Class 例としてこのようなiniファイルの場合、 sample.ini 別ウィンドウで開く すべて選択してコピー ダウンロード 行番号を表示する # # ini file # ; default section username=test ; comment password=xxxx ; comment ; setting for screen [screen] screenmode = fullscreen screensize = 640x480 refresh-rate = 60Hz ; setting for input [input] shot=0 bomb = 1 skip=2 cancel = 3 ; [screen] screensize = 800x600 次のような実行結果となる。 実行結果 [] <username>='test' <password>='xxxx' [screen] <screenmode>='fullscreen' <screensize>='800x600' <refresh-rate>='60Hz' [input] <shot>='0' <bomb>='1' <skip>='2' <cancel>='3'