はじめに
前回の振り返り
前回の記事では、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を選択した理由はいくつかあります。
- 互換性の確保: CSV形式は多くのプログラムやシステムで広くサポートされているため、他のツールとの連携が容易になります。
- データの可読性: CSV形式はテキストベースであるため、人間が読むことも、編集することも容易です。
- 効率的なデータ操作: PowerShellには
Import-Csv
とExport-Csv
といった、CSV形式のデータを効率的に扱うためのコマンドレットが用意されています。これにより、データの読み書きが非常にスムーズに行えます。
これらのメリットを考慮して、データ管理ツールのデータ保存形式はCSVに統一されました。これにより、ツールはさらに使いやすく、効率的なものとなります。
CSV形式でのデータ保存
CSVのカラム設定
このデータ管理ツールでは、CSVファイルを用いてデータを保存しています。CSVのカラムは以下のように設定されています。
- 主キー: データの一意な識別子
- 日付: データが作成された日付(YYYYMMDD形式)
- 内容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-Csv
とExport-Csv
のコマンドレットを使うことで、この処理を効率的に行うことができます。
まとめと次回予告
今回の成果
今回の記事では、データ管理ツールにおいて重要なデータの読み込み・書き込み機能、そしてデータの追加・削除機能を実装しました。特に、前回のToDoリスト作成の経験を活かし、テンプレートを作成することで効率的な開発が可能となりました。また、データの保存形式としてCSVを採用することで、データの可搬性と互換性が向上しました。
次回予告
データが増えてくると、特定のデータを素早く見つけ出す能力が求められます。次回はデータの検索機能を実装する手順を詳しく解説します。
🔍 探求を続ける
🔹 次のステップへ進む
🔗 「PowerShellでデータ管理ツールを作る – Part 3: データの検索機能の追加」を読む
🔹 全体のまとめとガイド
サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。
🔗 「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る
コメント