アットウィキロゴ
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