Imports System.Text
Module Module1
Sub Main()
'引数の例
'-a C:\Users\lucy\Desktop\sample.ini section1 option1
If Not TryExecute() Then
'ヘルプを表示
Dim builder As New System.Text.StringBuilder()
builder.AppendLine("検索するエントリをファイルから参照する場合 -f inifile.txt search.txt")
builder.AppendLine("検索するエントリを引数から参照する場合 -a inifile.txt section entry")
MsgBox(builder.ToString)
End If
End Sub
''' <summary>
''' 実行
''' </summary>
''' <returns>構文が間違ってたらFalseを返す</returns>
''' <remarks></remarks>
Private Function TryExecute() As Boolean
Dim args() As String = Environment.GetCommandLineArgs()
'ファイルを見るやつ -f sample.txt
'引数で直接指定する奴 -a section1 option2
If args.Length < 2 Then
MsgBox("引数が足りません")
Return False
End If
Dim cmd As String = args(1).ToLower
'検索する箇所
Dim searchEntries As New Dictionary(Of String, Dictionary(Of String, String))
Select Case cmd
Case "-a" '引数で直接指定する奴 -a inifile section1 option2
If args.Length <> 5 Then
MsgBox("引数が足りません")
Return False
Else
Dim iniFile As String = args(2)
Dim section As String = args(3)
Dim entry As String = args(4)
Dim entryList As New Dictionary(Of String, String)
entryList.Add(entry, "見つかりません")
searchEntries.Add(section, entryList)
FindAction(iniFile, searchEntries)
Return True
End If
Case "-f" 'ファイルを見るやつ -f inifile sample.txt
If args.Length <> 4 Then
MsgBox("引数が足りません")
Return False
Else
Dim iniFile As String = args(2)
Dim argsFile As String = args(3)
RegistFindPosition(iniFile, argsFile, searchEntries)
FindAction(iniFile, searchEntries)
Return True
End If
End Select
Return False
End Function
''' <summary>
''' 検索箇所をファイルから読み込み
''' </summary>
''' <param name="iniFile"></param>
''' <param name="argsFile"></param>
''' <param name="findPosition"></param>
''' <remarks></remarks>
Private Sub RegistFindPosition(ByVal iniFile As String, ByVal argsFile As String, ByVal findPosition As Dictionary(Of String, Dictionary(Of String, String)))
Dim encode As Encoding = EncodingParser.GetCode(argsFile)
Using reader As New IO.StreamReader(argsFile, encode)
Dim line As String = reader.ReadLine()
Dim section As String = Nothing
Dim entry As String = Nothing
While Not line Is Nothing
line = line.Trim
line = line.ToLower
'コメントではない
If IsValid(line) Then
'セクションかどうか
If line Like "[[]?*[]]" Then 'セクション
line = line.Replace("[", "")
line = line.Replace("]", "")
section = line
Else 'エントリ
entry = line
'セクションが空かどうか
If section Is Nothing Then
Else
'セクションがあるときだけ処理
Dim dic As Dictionary(Of String, String) = Nothing
If findPosition.ContainsKey(section) Then 'すでにあるとき
dic = findPosition(section)
Try
dic.Add(entry, "見つかりません") '初期の値は「見つかりません」としておく
Catch ex As Exception
MsgBox("エラー:重複するエントリが見つかりました")
Return
End Try
Else '初めて登録するとき
dic = New Dictionary(Of String, String)
dic.Add(entry, "見つかりません") '初期の値は「見つかりません」としておく
findPosition.Add(section, dic)
End If
End If
End If
End If
line = reader.ReadLine()
End While
End Using
End Sub
''' <summary>
''' 検索を実行
''' </summary>
''' <param name="iniFile"></param>
''' <param name="searchEntries"></param>
''' <remarks></remarks>
Private Sub FindAction(ByVal iniFile As String, ByVal searchEntries As Dictionary(Of String, Dictionary(Of String, String)))
'検索
FindIni(iniFile, searchEntries)
'結果を出力
Dim builder As New System.Text.StringBuilder()
For Each sectionEntryPair As KeyValuePair(Of String, Dictionary(Of String, String)) In searchEntries
Dim section = sectionEntryPair.Key
Dim entryAndValues = sectionEntryPair.Value
builder.AppendLine("[" & section & "]")
For Each entryAndValuePair As KeyValuePair(Of String, String) In entryAndValues
Dim entry As String = entryAndValuePair.Key
Dim value As String = entryAndValuePair.Value
builder.AppendLine(" " & entry & " = " & value)
Next
builder.AppendLine()
Next
MsgBox(builder.ToString)
End Sub
''' <summary>
''' 検索
''' </summary>
''' <param name="iniFile"></param>
''' <param name="sectionEntryDictionary"></param>
''' <remarks></remarks>
Private Sub FindIni(ByVal iniFile As String, ByVal sectionEntryDictionary As Dictionary(Of String, Dictionary(Of String, String)))
Dim encode As Encoding = EncodingParser.GetCode(iniFile)
Using reader As New IO.StreamReader(iniFile, encode)
Dim line As String = reader.ReadLine()
Dim section As String = Nothing
While Not line Is Nothing
line = line.Trim
line = line.ToLower
'コメントではない
If IsValid(line) Then
'セクションかどうか
If line Like "[[]?*[]]" Then 'セクション
line = line.Replace("[", "")
line = line.Replace("]", "")
section = line
Else 'エントリ
Dim sepalate() As String = line.Split(New Char() {"="c})
If sepalate.Length = 2 Then
Dim entry As String = sepalate(0).Trim
Dim value As String = sepalate(1).Trim
If sectionEntryDictionary.ContainsKey(section) Then
Dim entryAndValue As Dictionary(Of String, String) = sectionEntryDictionary(section)
If entryAndValue.ContainsKey(entry) Then
entryAndValue(entry) = value
End If
End If
Else
'異常時
End If
End If
End If
line = reader.ReadLine()
End While
End Using
End Sub
Private Function IsValid(ByVal line As String) As Boolean
Return Not line.StartsWith(";") And Not line = ""
End Function
End Module
最終更新:2013年11月09日 19:40