PowerShellでデータ管理ツールを作る – Part 2: データの読み込み・書き込み機能の追加

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

はじめに

前回の振り返り

前回の記事では、PowerShellを用いて多様なデータを効率よく管理するためのツールを設計しました。このツールは、顧客情報、プロジェクトの進捗、個人的なToDoリストなど、多様なデータ形式と複数のユーザーケースに対応しています。

今回の目的

今回の記事では、その設計に基づいて、データの読み込みと書き込みの機能を追加します。特に、CSV形式でのデータ保存にも対応することを目的としています。前回のToDoリスト作成ツールで学んだ知識を活かし、テンプレートを作成してから新機能を組み込む形で進めていきます。

この記事を通じて、PowerShellでのプログラミングスキルを一層深め、データ管理作業をより効率的に行えるようになることを目指します。

テンプレートの作成

ToDoリスト作成の経験を活かす

前回のToDoリスト作成ツールで学んだプログラミングの基本概念を活かし、新しいデータ管理ツールのテンプレートを作成します。具体的には、エラーハンドリングのためのTry~Catch句、変数や関数の定義の上部設定、相対パスの使用などが含まれます。

Try~Catch句で全体をくくる

プログラム全体をTry~Catch句でくくることで、予期せぬエラーが発生した場合でも適切に対処できます。

Try {
    # プログラムの主要部分
}
Catch {
    Write-Host "予期せぬエラーが発生しました: $($_.Exception.Message)"
}

相対パスを使用する

ファイルやディレクトリへのアクセスには相対パスを使用します。これにより、プログラムがどこで実行されても、正確にファイルにアクセスできます。

$commonPath = "$PSScriptRoot\.."

定義はなるべく上部で設定

プログラムの可読性とメンテナンス性を高めるために、変数や関数の定義はなるべくプログラムの上部で行います。

$commonPath = "$PSScriptRoot\.."
$csvFile = "$commonPath\data\data.csv"

このようなテンプレートを基に、次のステップで具体的なデータ管理機能を追加していきます。

データの読み込み機能の追加

概要

このセクションでは、テンプレートにデータの読み込み機能を追加します。具体的には、CSV形式のファイルからデータを読み込む機能を実装します。

CSVファイルの存在チェック

まず、読み込むCSVファイルが存在するかどうかを確認します。

if (-not (Test-Path $csvFile)) {
    New-Item $csvFile -ErrorAction Stop >$null
}

データの読み込み

CSVファイルが存在する場合、その内容を読み込みます。

$csvData = Import-Csv -Path $csvFile

データの格納

読み込んだデータは、後の処理で使用するために変数に格納します。

$records = @()
$records += $csvData

主キーの自動生成と管理

このプロジェクトでは、各データレコードに一意の「主キー」を割り当てる必要があります。主キーは、last_key.txtという定義ファイルに保存します。このファイルには、最後に使用された主キーの値が記録されています。

新しいデータが追加される際には、このlast_key.txtファイルを読み込み、その値に1を加えた数値が新しいデータの主キーとして割り当てられます。その後、新しい主キーの値でlast_key.txtファイルを更新します。

このようにして、主キーを一意かつ自動で管理することで、データの整合性を保ちます。

# 主キーの定義ファイルのパス設定
$keyFile = "$commonPath\data\last_key.txt"

# 主キーの最後の値を読み込む
if (Test-Path $keyFile) {
    $lastKey = Get-Content $keyFile
} else {
    $lastKey = 0
}

# 新しい主キーを生成
$newKey = [int]$lastKey + 1

# 新しい主キーで定義ファイルを更新
Set-Content -Path $keyFile -Value $newKey

完成したコードの一部

以上の手順を踏まえ、テンプレートにデータの読み込み機能を追加した部分のコードは以下のようになります。

Try {
    # 共通のパスの設定
    $commonPath = "$PSScriptRoot\.."
    
    # CSVファイルのパス設定
    $csvFile = "$commonPath\data\data.csv"
    
    # 主キーの定義ファイルのパス設定
    $keyFile = "$commonPath\data\last_key.txt"
    
    # CSVファイルが存在するかチェックし、なければ新規作成
    if (-not (Test-Path $csvFile)) {
        New-Item $csvFile -ErrorAction Stop >$null
    }
    
    # 主キーの最後の値を読み込む
    if (Test-Path $keyFile) {
        $lastKey = Get-Content $keyFile
    } else {
        $lastKey = 0
    }
    
    # CSVファイルからデータを読み込む
    $csvData = Import-Csv -Path $csvFile -Encoding Default
    
    # 読み込んだデータを格納する配列を初期化
    $records = @()
    
    # 読み込んだデータを配列に追加
    $records += $csvData
    
    # 以降、主要な処理(データの追加、削除、表示など)
}
Catch {
    # エラーが発生した場合の処理
    Write-Host "予期せぬエラーが発生しました: $($_.Exception.Message)"
}

データの書き込み、追加、削除機能の追加

このセクションでは、データの書き込み、追加、削除機能を一括して追加します。まずは、ユーザーが操作を選択できるメニューを作成しましょう。

操作選択のメニュー

ToDoリスト作成時と同様に、switch文を用いてメニューを表示します。この部分はToDoリストのコードと共通です。

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

データの書き込み、追加、削除関数

次に、データの書き込み、追加、削除を行う関数を作成します。

# データ書き込み関数
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 のデータが削除されました。"
}

これで、ユーザーはメニューから操作を選択し、それに応じた処理が行われるようになりました。

ファイル配置とソースコード全体版

ファイル配置

デスクトップ上に「work2」フォルダを作成し、前回と同様のフォルダ構成とします。
ファイル名は「dataMng.ps1」「dataMng.bat」とします。

ソースコード(全体版)

以下が今までの説明に基づいて作成したPowerShellのソースコード全体版です。

dataMng.ps1
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 のデータが削除されました。"
    }
    
    # メニュー表示
    do {
        $choice = Read-Host "操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: 終了)"
        switch ($choice) {
            '1' { AddData }
            '2' { RemoveData }
            '3' { SaveData }
            '4' { Write-Host "プログラムを終了します。"; break }
            default { Write-Host "無効な選択です。再度選択してください。" }
        }
    } while ($choice -ne '4')
    
} Catch {
    # エラーメッセージ出力
    Write-Host "予期せぬエラーが発生しました: $($_.Exception.Message)"
}

また、ps1を呼び出すbatのコードを記載します。

dataMng.bat
@echo off
powershell.exe -ExecutionPolicy RemoteSigned "%~dp0bin\dataMng.ps1"

pause

実機検証

実際に動かしてみます。

ファイルが作成されました。

保存されました。

CSVについて

CSVとは

CSV(Comma-Separated Values)は、データをコンマで区切って保存するテキスト形式の一つです。この形式は表形式のデータを簡潔に表現するのに適しており、スプレッドシートやデータベースとの互換性も高いです。

なぜCSV形式か

データの保存形式としてCSVを選択した理由はいくつかあります。

  1. 互換性の確保: CSV形式は多くのプログラムやシステムで広くサポートされているため、他のツールとの連携が容易になります。
  2. データの可読性: CSV形式はテキストベースであるため、人間が読むことも、編集することも容易です。
  3. 効率的なデータ操作: PowerShellにはImport-CsvExport-Csvといった、CSV形式のデータを効率的に扱うためのコマンドレットが用意されています。これにより、データの読み書きが非常にスムーズに行えます。

これらのメリットを考慮して、データ管理ツールのデータ保存形式はCSVに統一されました。これにより、ツールはさらに使いやすく、効率的なものとなります。

CSV形式でのデータ保存

CSVのカラム設定

このデータ管理ツールでは、CSVファイルを用いてデータを保存しています。CSVのカラムは以下のように設定されています。

  1. 主キー: データの一意な識別子
  2. 日付: データが作成された日付(YYYYMMDD形式)
  3. 内容1, 内容2, 内容3: 任意のデータフィールド

このようなカラム設定は、[PSCustomObject]を用いてデータを作成する際に定義されます。

$newData = [PSCustomObject]@{
    '主キー' = $primaryKey
    '日付' = $date
    '内容1' = $content1
    '内容2' = $content2
    '内容3' = $content3
}

CSV形式でのデータ保存方法

データの保存はExport-Csvコマンドレットを使用して行います。このコマンドレットは、PowerShellのオブジェクトをCSV形式でファイルに出力する機能を提供します。

$global:data | Export-Csv -Path $dataFile -NoTypeInformation  -Encoding Default

-NoTypeInformationオプションは、CSVファイルの先頭に型情報(#TYPE…)を書き込まないようにするために使用されます。
-Encodingオプションは、文字コードを設定しています。DefaultではShift-JISが設定されます。

このようにして、CSV形式でデータを簡単に保存・読み込みすることができます。特に、Import-CsvExport-Csvのコマンドレットを使うことで、この処理を効率的に行うことができます。

まとめと次回予告

今回の成果

今回の記事では、データ管理ツールにおいて重要なデータの読み込み・書き込み機能、そしてデータの追加・削除機能を実装しました。特に、前回のToDoリスト作成の経験を活かし、テンプレートを作成することで効率的な開発が可能となりました。また、データの保存形式としてCSVを採用することで、データの可搬性と互換性が向上しました。

次回予告

データが増えてくると、特定のデータを素早く見つけ出す能力が求められます。次回はデータの検索機能を実装する手順を詳しく解説します。

🔍 探求を続ける

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

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

コメント

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