PowerShellでデータ管理ツールを作る – Part 3: データの検索機能の追加

※本サイトはプロモーションが含まれています。

この記事では、PowerShellを用いて作成したデータ管理ツールに検索機能を追加する方法について詳しく解説します。特に、Part 1で設計された「キーワードや日付範囲での検索が可能」という機能を具体的に実装する手順をご紹介します。この機能により、データ管理がさらに効率的に行えるようになります。

検索機能の設計

Part 1での基本設計に基づき、このセクションでは検索機能を追加する前に考慮すべきポイントについて説明します。

検索フィールド

データ管理ツールでは、多様なデータ形式(例:日付、内容1、内容2、内容3)が存在します。これらのどのフィールドで検索を行うかが重要です。Part 1での設計では、日付とキーワード(内容1、内容2、内容3)での検索が可能とされています。

検索条件

検索条件も非常に重要です。例えば、日付範囲での検索や、複数のキーワードを用いた検索などが考えられます。これにより、ユーザーは目的のデータをより効率的に探すことができます。

検索結果の表示

検索結果はどのように表示されるかも考慮点です。一覧表示されるのか、それとも特定のフィールドだけが表示されるのか、その設計が必要です。

エラーハンドリング

検索クエリが不正な場合や、該当するデータがない場合のエラーハンドリングも設計に含めるべきです。

コードの追加

このセクションでは、Part 1での基本設計に基づいて、データ管理ツールに検索機能を追加するための具体的なPowerShellコードを提供し、その説明を行います。

Where-Object の説明

Where-Object は PowerShell のコマンドレットで、配列やオブジェクトのコレクションから特定の条件に一致する要素をフィルタリングします。この記事では、Where-Object を使用してユーザーが指定したフィールドとキーワードに一致するデータを検索しています。

複数条件でのデータ検索関数

複数の条件でデータを検索できるように、新しい関数を追加します。

# 複数条件でのデータ検索関数
function MultiSearchData {
    $searchDateRange = Read-Host "検索する日付範囲を入力してください(YYYYMMDD-YYYYMMDD、空白で全範囲)"
    $startDate, $endDate = $searchDateRange -split '-'
    $searchKeyword = Read-Host "検索するキーワードを入力してください"

    $searchResult = @($global:data | Where-Object {
        ($_.日付 -ge $startDate -or -not $startDate) -and
        ($_.日付 -le $endDate -or -not $endDate) -and
        ($_.内容1 -like "*$searchKeyword*" -or $_.内容2 -like "*$searchKeyword*" -or $_.内容3 -like "*$searchKeyword*")
    })

    if ($searchResult.Count -eq 0) {
        Write-Host "該当するデータはありません。"
    } else {
        Write-Host "検索結果:"
        $searchResult
    }
}

# メニュー表示
do {
    $choice = Read-Host "操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: 終了)"
    switch ($choice) {
        '1' { AddData }
        '2' { RemoveData }
        '3' { SaveData }
        '4' { MultiSearchData }
        '5' { Write-Host "プログラムを終了します。"; break }
        default { Write-Host "無効な選択です。再度選択してください。" }
    }
} while ($choice -ne '5')

これで、データの追加、削除、保存に加えて、複数条件での検索も行えるようになりました。

ソースコード全体版

ここまでの内容を取り込みます。

Try {
    # 共通のパスの設定
    $commonPath = "$PSScriptRoot\.."
    
    # CSVファイル設定
    $dataFile = "$commonPath\data\data.csv"
    
    # 主キー用の定義ファイル設定
    $keyFile = "$commonPath\data\last_key.txt"
    
    # データの配列を宣言
    $global:data = @()
    
    # 主キーの初期値設定
    if (Test-Path $keyFile) {
        $newPrimaryKey = [int](Get-Content $keyFile)
    } else {
        $newPrimaryKey = 1
    }
    
    # ファイル存在チェック
    if (Test-Path $dataFile) {
        # ファイル読み込み(Shift-JIS)
        $tempData = Import-Csv -Path $dataFile -Encoding Default
        # $tempData が配列でない場合、配列に変換
        $global:data = @($tempData)
        Write-Host "データがCSVファイルから読み込まれました。"
    }

    # データ書き込み関数
    function SaveData {
        $global:data | Export-Csv -Path $dataFile -NoTypeInformation -Encoding Default
        Write-Host "データがCSVファイルに保存されました。"
    }
    
    # データ追加関数
    function AddData {
        # 主キーの更新
        $newPrimaryKey++
        
        $date = Read-Host "日付を入力してください(YYYYMMDD形式)"
        $content1 = Read-Host "内容1を入力してください"
        $content2 = Read-Host "内容2を入力してください"
        $content3 = Read-Host "内容3を入力してください"
        
        $newData = [PSCustomObject]@{
            '主キー' = $newPrimaryKey
            '日付' = $date
            '内容1' = $content1
            '内容2' = $content2
            '内容3' = $content3
        }
        
        $global:data += $newData
        Write-Host "新しいデータが追加されました。"
        
        # 主キー用の定義ファイルを更新
        $newPrimaryKey | Out-File $keyFile
    }
    
    # データ削除関数
    function RemoveData {
        $keyToRemove = Read-Host "削除するデータの主キーを入力してください"
        $global:data = $global:data | Where-Object { $_.'主キー' -ne $keyToRemove }
        Write-Host "$keyToRemove のデータが削除されました。"
    }

    # 複数条件でのデータ検索関数
    function MultiSearchData {
        $searchDateRange = Read-Host "検索する日付範囲を入力してください(YYYYMMDD-YYYYMMDD、空白で全範囲)"
        $startDate, $endDate = $searchDateRange -split '-'
        $searchKeyword = Read-Host "検索するキーワードを入力してください"
    
        $searchResult = @($global:data | Where-Object {
            ($_.日付 -ge $startDate -or -not $startDate) -and
            ($_.日付 -le $endDate -or -not $endDate) -and
            ($_.内容1 -like "*$searchKeyword*" -or $_.内容2 -like "*$searchKeyword*" -or $_.内容3 -like "*$searchKeyword*")
        })
    
        if ($searchResult.Count -eq 0) {
            Write-Host "該当するデータはありません。"
        } else {
            Write-Host "検索結果:"
            $searchResult
        }
    }
        
    # メニュー表示
    do {
        $choice = Read-Host "操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: 終了)"
        switch ($choice) {
            '1' { AddData }
            '2' { RemoveData }
            '3' { SaveData }
            '4' { MultiSearchData }
            '5' { Write-Host "プログラムを終了します。"; break }
            default { Write-Host "無効な選択です。再度選択してください。" }
        }
    } while ($choice -ne '5')
    
} Catch {
    # エラーメッセージ出力
    Write-Host "予期せぬエラーが発生しました: $($_.Exception.Message)"
}

実機確認

検索できるようになりました。

まとめと次のステップ

この記事では、PowerShellで作成したデータ管理ツールに検索機能を追加する方法を詳しく解説しました。特に、Where-Object コマンドレットを用いて複数条件での検索が可能な機能を実装しました。これにより、ユーザーは特定の日付範囲やキーワードでデータを効率よく検索できるようになり、ツールの使い勝手が大幅に向上しました。

次回のトピックでは、「ソート機能の追加」に焦点を当てます。データが増えてくると、その整理やソートが重要になってきます。次回は、これらの機能をどのように実装するかについて詳しく解説します。

この検索機能の追加が、あなたのデータ管理作業をよりスムーズに、そして効率的にする一助となれば幸いです。

🔍 探求を続ける

🔹 次のステップへ進む
🔗 「PowerShellでデータ管理ツールを作る – Part 4: データのソート機能の追加」を読む

🔹 全体のまとめとガイド
サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。
🔗 「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る

コメント

タイトルとURLをコピーしました