<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>データ管理ツール作成 | 猫プロ</title>
	<atom:link href="https://nekomichi-coder.com/category/%E3%83%87%E3%83%BC%E3%82%BF%E7%AE%A1%E7%90%86%E3%83%84%E3%83%BC%E3%83%AB%E4%BD%9C%E6%88%90/feed/" rel="self" type="application/rss+xml" />
	<link>https://nekomichi-coder.com</link>
	<description>猫道のプログラミング道</description>
	<lastBuildDate>Sun, 05 Oct 2025 04:25:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://nekomichi-coder.com/wp-content/uploads/2023/08/cropped-IMG_4667-32x32.jpeg</url>
	<title>データ管理ツール作成 | 猫プロ</title>
	<link>https://nekomichi-coder.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PowerShellでデータ管理ツールを作る &#8211; Part 5: データのバックアップ機能の追加</title>
		<link>https://nekomichi-coder.com/make-a-data-management-tool-part-5/</link>
					<comments>https://nekomichi-coder.com/make-a-data-management-tool-part-5/#respond</comments>
		
		<dc:creator><![CDATA[猫道]]></dc:creator>
		<pubDate>Thu, 07 Sep 2023 15:32:46 +0000</pubDate>
				<category><![CDATA[データ管理ツール作成]]></category>
		<guid isPermaLink="false">https://nekomichi-coder.com/?p=733</guid>

					<description><![CDATA[今回で「PowerShellでデータ管理ツールを作る」というシリーズは最終回となります。長い間、ご一緒いただきありがとうございます。 これまでの記事では、データの追加、削除、保存、検索、そしてソートなど、多様なデータ管理 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>今回で「PowerShellでデータ管理ツールを作る」というシリーズは最終回となります。長い間、ご一緒いただきありがとうございます。</p>



<p><strong>これまでの記事では、データの追加、削除、保存、検索、そしてソートなど、多様なデータ管理機能をPowerShellで実装してきました。</strong>特に、エンジニアになるにはどうしたらよいか、PowerShellプログラミングの入門として、基本的な機能から応用まで幅広くカバーしてきました。</p>



<p>今回は、これらの機能に加えて非常に重要な「データのバックアップ機能」を追加します。データは企業活動や個人の日常においても非常に価値のあるものです。その価値あるデータを失わないように、また、何らかのトラブルからすぐに復旧できるようにするためには、バックアップが不可欠です。</p>



<p>この記事を通じて、PowerShellを用いたデータのバックアップ機能の追加方法を学び、より堅牢なデータ管理ツールを作成していきましょう。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">上司からの新たな依頼: データのバックアップ</a></li><li><a href="#toc2" tabindex="0">バックアップ機能の設計</a><ol><li><a href="#toc3" tabindex="0">要件</a></li><li><a href="#toc4" tabindex="0">設計</a></li></ol></li><li><a href="#toc5" tabindex="0">バックアップ機能の実装</a><ol><li><a href="#toc6" tabindex="0">「bk」フォルダの作成（手動）</a></li><li><a href="#toc7" tabindex="0">バックアップファイルの自動作成</a></li><li><a href="#toc8" tabindex="0">バックアップファイルの命名規則</a></li><li><a href="#toc9" tabindex="0">古いバックアップファイルの自動削除</a></li></ol></li><li><a href="#toc10" tabindex="0">ソースコード（完成版）</a></li><li><a href="#toc11" tabindex="0">バックアップ機能のテスト</a><ol><li><a href="#toc12" tabindex="0">バックアップファイルの自動作成テスト</a></li><li><a href="#toc13" tabindex="0">バックアップファイルの命名規則テスト</a></li><li><a href="#toc14" tabindex="0">古いバックアップファイルの自動削除テスト</a></li></ol></li><li><a href="#toc15" tabindex="0">まとめと次のステップ</a><ol><li><a href="#toc16" tabindex="0">学べたこと</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">上司からの新たな依頼: データのバックアップ</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>ツールありがとうね。最初に言っていたバックアップ機能もつくってほしいな。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>わかりました！</p>
</div></div>



<p>この一言には、データ管理ツールが日常業務での重要な位置を占め始めたこと、そしてそのデータがどれだけ価値を持っているかという認識が込められています。基本的なデータの追加や削除、検索機能などはすでに実装していますが、それだけでは不十分です。何らかの理由でデータが失われた場合、それを復元する手段が必要です。</p>



<p>上司のこの依頼は、データ管理ツールをさらに堅牢で信頼性の高いものにするための重要なステップです。この依頼を受け、今回はデータのバックアップ機能の追加に取り組みます。</p>



<h2 class="wp-block-heading"><span id="toc2">バックアップ機能の設計</span></h2>



<p>データのバックアップは、データ管理ツールの信頼性と堅牢性を高めるために非常に重要な機能です。このセクションでは、バックアップ機能の要件と設計について詳しく説明します。</p>



<h3 class="wp-block-heading"><span id="toc3">要件</span></h3>



<ol class="wp-block-list has-ex-a-background-color has-background">
<li>バックアップファイルは「bk」という名前の新しいフォルダに保存される。このフォルダは手動で作成する。</li>



<li>データを保存する際に、自動的にバックアップが行われる。</li>



<li>バックアップファイルはCSV形式で保存される。</li>



<li>バックアップファイルの名称は「data_yyyymmdd.csv」とする。</li>



<li>データを保存する際に、保存日付から5日以上経過したバックアップファイルは自動的に削除される（容量の関係）。</li>
</ol>



<h3 class="wp-block-heading"><span id="toc4">設計</span></h3>



<ol class="wp-block-list has-ex-a-background-color has-background">
<li><strong>「bk」フォルダの作成（手動）</strong>:<br>ユーザーが手動で「bk」という名前の新しいフォルダを作成します。このフォルダは、バックアップファイルの保存場所となります。</li>



<li><strong>データ保存時のバックアップ</strong>:<br>ユーザーがデータを保存するたびに、バックアップファイルが自動的に作成されます。</li>



<li><strong>CSVファイルのコピーと格納</strong>:<br>バックアップが行われる際には、現在のデータが保存されているCSVファイルをコピーし、「bk」フォルダに格納します。</li>



<li><strong>バックアップファイルの命名規則</strong>:<br>作成されるバックアップファイルの名称は「data_yyyymmdd.csv」とします。これにより、いつのバックアップか一目でわかるようになります。</li>



<li><strong>古いバックアップファイルの自動削除</strong>:<br>データを保存するときに、保存日付から5日以上経過したバックアップファイルは自動的に削除されます。これはディスク容量を節約するための措置です。</li>
</ol>



<p>以上がバックアップ機能の基本的な設計です。この設計に基づき、次のセクションで具体的な実装に取り組みます。</p>



<h2 class="wp-block-heading"><span id="toc5">バックアップ機能の実装</span></h2>



<p>このセクションでは、前述した設計に基づいて、バックアップ機能の具体的な実装手順を解説します。コードの各部分にコメントも付けて、初心者の方でも理解しやすいように工夫しています。</p>



<h3 class="wp-block-heading"><span id="toc6">「bk」フォルダの作成（手動）</span></h3>



<p>まずは、「bk」という名前の新しいフォルダを手動で作成してください。このフォルダは、バックアップファイルの保存場所となります。</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="901" height="565" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-11.png" alt="" class="wp-image-735" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-11.png 901w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-11-300x188.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-11-768x482.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></figure>



<h3 class="wp-block-heading"><span id="toc7">バックアップファイルの自動作成</span></h3>



<p>データを保存する関数<code>SaveData</code>内で、バックアップファイルを自動的に作成します。</p>



<pre class="wp-block-code"><code># データ書き込み関数
function SaveData {
    $global:data | Export-Csv -Path $dataFile -NoTypeInformation -Encoding Default
    Write-Host "データがCSVファイルに保存されました。"

    # バックアップの作成
    $backupFileName = "data_" + (Get-Date -Format "yyyyMMdd") + ".csv"
    $backupPath = "$commonPath\bk\$backupFileName"
    Copy-Item $dataFile -Destination $backupPath
    Write-Host "バックアップが作成されました。"
}
</code></pre>



<ul class="wp-block-list">
<li><code>$backupFileName</code>: 今日の日付を<code>yyyyMMdd</code>形式で取得し、バックアップファイル名を生成します。</li>



<li><code>$backupPath</code>: バックアップファイルの保存先パスを指定します。</li>



<li><code>Copy-Item</code>: 現在のデータファイルをコピーして、バックアップフォルダに保存します。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc8">バックアップファイルの命名規則</span></h3>



<p>上記のコードにおいて、バックアップファイルの名称は「data_yyyymmdd.csv」となるように設定しています。yyyymmddはシステム日付（ツールを実行するPC上の日付）です。</p>



<h3 class="wp-block-heading"><span id="toc9">古いバックアップファイルの自動削除</span></h3>



<p>データを保存する際に、保存日付から5日以上経過したバックアップファイルを自動で削除します。</p>



<pre class="wp-block-code"><code># 古いバックアップファイルの削除
$limitDate = (Get-Date).AddDays(-5).ToString("yyyyMMdd")
Get-ChildItem "$commonPath\bk\" -Filter "data_*.csv" | ForEach-Object {
    $fileDate = $_.Name.Substring(5, 8)
    if (&#91;int]$fileDate -le &#91;int]$limitDate) {
        Remove-Item $_.FullName
        Write-Host "$($_.Name) が削除されました。"
    }
}
</code></pre>



<ul class="wp-block-list">
<li><code>$limitDate</code>: 今日から5日前の日付を<code>yyyyMMdd</code>形式で取得します。</li>



<li><code>Get-ChildItem</code>: バックアップフォルダ内のCSVファイルを取得します。</li>



<li><code>$fileDate</code>: ファイル名から日付部分を抽出します。</li>



<li><code>Remove-Item</code>: 条件に合致する古いバックアップファイルを削除します。</li>
</ul>



<p>このコードを<code>SaveData</code>関数の最後に追加してください。</p>



<figure class="wp-block-image size-medium"><img decoding="async" width="300" height="183" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg" alt="" class="wp-image-664" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-768x468.jpg 768w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0.jpg 1000w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<h2 class="wp-block-heading"><span id="toc10">ソースコード（完成版）</span></h2>



<pre class="wp-block-code"><code>Try {
    # 共通のパスの設定
    $commonPath = "$PSScriptRoot\.."
    
    # CSVファイル設定
    $dataFile = "$commonPath\data\data.csv"
    
    # 主キー用の定義ファイル設定
    $keyFile = "$commonPath\data\last_key.txt"
    
    # データの配列を宣言
    $global:data = @()
    
    # 主キーの初期値設定
    if (Test-Path $keyFile) {
        $newPrimaryKey = &#91;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 SaveData {
        $global:data | Export-Csv -Path $dataFile -NoTypeInformation -Encoding Default
        Write-Host "データがCSVファイルに保存されました。"
        
        # バックアップの作成
        $backupFileName = "data_" + (Get-Date -Format "yyyyMMdd") + ".csv"
        $backupPath = "$commonPath\bk\$backupFileName"
        Copy-Item $dataFile -Destination $backupPath
        Write-Host "バックアップが作成されました。"
        
        # 古いバックアップファイルの削除
        $limitDate = (Get-Date).AddDays(-5).ToString("yyyyMMdd")
        Get-ChildItem "$commonPath\bk\" -Filter "data_*.csv" | ForEach-Object {
            $fileDate = $_.Name.Substring(5, 8)
            if (&#91;int]$fileDate -le &#91;int]$limitDate) {
                Remove-Item $_.FullName
                Write-Host "$($_.Name) が削除されました。"
            }
        }
    
    }

    
    # データ追加関数
    function AddData {
        # 主キーの更新
        $newPrimaryKey++
        
        $date = Read-Host "日付を入力してください（YYYYMMDD形式）"
        $content1 = Read-Host "内容1を入力してください"
        $content2 = Read-Host "内容2を入力してください"
        $content3 = Read-Host "内容3を入力してください"
        
        $newData = &#91;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
        }
    }
    
    #ソート関数
    function SortData {
        $sortColumn = Read-Host "ソートする列を選択してください（主キー、日付、内容1、内容2、内容3）"
        $sortOrder = Read-Host "ソート順を選択してください（asc: 昇順, desc: 降順）"
    
        if ($sortOrder -eq 'asc') {
            $global:data = $global:data | Sort-Object $sortColumn
        } elseif ($sortOrder -eq 'desc') {
            $global:data = $global:data | Sort-Object $sortColumn -Descending
        } else {
            Write-Host "無効なソート順です。ソートは実行されません。"
            return
        }
    
        Write-Host "$sortColumn 列を $sortOrder でソートしました。"
    }
            
    # メニュー表示
    do {
        $choice = Read-Host "操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了)"
        switch ($choice) {
            '1' { AddData }
            '2' { RemoveData }
            '3' { SaveData }
            '4' { MultiSearchData }
            '5' { SortData }
            '6' { Write-Host "プログラムを終了します。"; break }
            default { Write-Host "無効な選択です。再度選択してください。" }
        }
    } while ($choice -ne '6')
    
} Catch {
    # エラーメッセージ出力
    Write-Host "予期せぬエラーが発生しました: $($_.Exception.Message)"
}
</code></pre>



<h2 class="wp-block-heading"><span id="toc11">バックアップ機能のテスト</span></h2>



<p>このセクションでは、実装したバックアップ機能が正しく動作するかどうかを確認するためのテスト方法とその結果を示します。例では2023/09/08に実行しています。</p>



<h3 class="wp-block-heading"><span id="toc12">バックアップファイルの自動作成テスト</span></h3>



<ol class="wp-block-list">
<li>データを追加または削除して、<code>SaveData</code>関数を実行します。</li>



<li>「bk」フォルダ内に今日の日付に基づいたバックアップファイル（例：<code>data_20230908.csv</code>）が作成されていることを確認します。</li>
</ol>



<p><strong>結果</strong>: バックアップファイルが正しく作成されました。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="979" height="512" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-12.png" alt="" class="wp-image-739" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-12.png 979w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-12-300x157.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-12-768x402.png 768w" sizes="(max-width: 979px) 100vw, 979px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="901" height="565" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-13.png" alt="" class="wp-image-740" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-13.png 901w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-13-300x188.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-13-768x482.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></figure>



<h3 class="wp-block-heading"><span id="toc13">バックアップファイルの命名規則テスト</span></h3>



<ol class="wp-block-list">
<li>複数日にわたってデータを保存します。</li>



<li>「bk」フォルダ内のバックアップファイルが、それぞれ異なる日付で命名されていることを確認します。</li>
</ol>



<p><strong>結果</strong>: バックアップファイルの命名規則が正しく適用されました。</p>



<h3 class="wp-block-heading"><span id="toc14">古いバックアップファイルの自動削除テスト</span></h3>



<ol class="wp-block-list">
<li>5日以上前のバックアップファイルを「bk」フォルダに保存します。</li>



<li>データを追加または削除して、<code>SaveData</code>関数を実行します。</li>



<li>5日以上前のバックアップファイルが自動的に削除されていることを確認します。</li>
</ol>



<p><strong>結果</strong>: 古いバックアップファイルが正しく削除されました。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="901" height="565" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-14.png" alt="" class="wp-image-741" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-14.png 901w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-14-300x188.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-14-768x482.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="979" height="512" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-15.png" alt="" class="wp-image-742" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-15.png 979w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-15-300x157.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-15-768x402.png 768w" sizes="(max-width: 979px) 100vw, 979px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="901" height="565" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-16.png" alt="" class="wp-image-743" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-16.png 901w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-16-300x188.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-16-768x482.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></figure>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>できました！</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>ありがとう！お疲れ様。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc15">まとめと次のステップ</span></h2>



<p>このシリーズを通じて、PowerShellを用いたデータ管理ツールの設計から実装、そしてテストまでの一連の流れを学ぶことができました。</p>



<h3 class="wp-block-heading"><span id="toc16">学べたこと</span></h3>



<ol class="wp-block-list has-ex-a-background-color has-background">
<li><strong>データのCRUD操作</strong>: データの追加、読み込み、更新、削除（CRUD）の基本的な操作方法</li>



<li><strong>エラーハンドリング</strong>: 予期せぬエラーに対処するためのエラーハンドリングの基礎</li>



<li><strong>データの検索とソート</strong>: 効率的なデータ管理のための検索とソート機能</li>



<li><strong>バックアップ機能</strong>: データの安全性を確保するためのバックアップ機能</li>
</ol>



<p>プログラミングスキルをさらに高めたい、またはエンジニアとしてのキャリアを考えている方は、専門的なプログラミングスクールに参加することをお勧めします。<br>また、転職サイトを活用して、より高度なエンジニアリングの仕事を探すことも一つの方法です。</p>



<p>以下のおすすめ記事では、おすすめのサービスを紹介しています。参考にしていただければ幸いです。</p>



<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>&#x1f50d; <strong>おすすめ記事</strong></p>



<p>&#x1f539; <strong><strong>次のステップへ進む</strong></strong><br>&#x1f517; <a href="https://nekomichi-coder.com/how-to-proceed-with-programming-learning/" data-type="link" data-id="https://nekomichi-coder.com/how-to-proceed-with-programming-learning/">「プログラミング学習の進め方 – オンラインリソースとプログラミングスクール」を読む</a></p>



<p>&#x1f517; <a href="https://nekomichi-coder.com/career-change-sites-and-how-to-use-them/" data-type="link" data-id="https://nekomichi-coder.com/career-change-sites-and-how-to-use-them/">「プログラミングでキャリアチェンジを考える – 転職サイトとその活用方法」を読む</a></p>



<p>&#x1f539; <strong>全体のまとめとガイド</strong><br>サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。<br>&#x1f517; <a href="https://nekomichi-coder.com/overview/" title="サイト全体のガイドを見る">「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る</a></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://nekomichi-coder.com/make-a-data-management-tool-part-5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PowerShellでデータ管理ツールを作る &#8211; Part 4: データのソート機能の追加</title>
		<link>https://nekomichi-coder.com/make-a-data-management-tool-part-4/</link>
					<comments>https://nekomichi-coder.com/make-a-data-management-tool-part-4/#respond</comments>
		
		<dc:creator><![CDATA[猫道]]></dc:creator>
		<pubDate>Thu, 07 Sep 2023 14:32:41 +0000</pubDate>
				<category><![CDATA[データ管理ツール作成]]></category>
		<guid isPermaLink="false">https://nekomichi-coder.com/?p=718</guid>

					<description><![CDATA[今回は、PowerShellでデータ管理ツールを作成するプロジェクトのPart 4に挑戦します。Part 3までには、データの追加・削除機能や、検索機能などを実装してきました。それらの機能は、データ管理ツールが日常業務で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>今回は、PowerShellでデータ管理ツールを作成するプロジェクトのPart 4に挑戦します。Part 3までには、データの追加・削除機能や、検索機能などを実装してきました。それらの機能は、データ管理ツールが日常業務で役立つ基本的なものです。</p>



<p>今回の記事では、データのソート機能を追加します。この機能は、データの管理をさらに効率化するためのものであり、特定の順序でデータを整列させることができます。例えば、日付順やアルファベット順など、ユーザーが任意でソート順を指定できるようにすることが目的です。</p>



<p>この記事を通じて、PowerShellの基本的な使い方から、具体的なプログラムの作成までの一連の流れを理解し、自身でのプログラミングに自信を持っていただければ幸いです。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4"><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ソート機能の設計</a><ol><li><a href="#toc2" tabindex="0">設計のポイント</a></li><li><a href="#toc3" tabindex="0">インターフェース</a></li></ol></li><li><a href="#toc4" tabindex="0">コードの実装</a><ol><li><a href="#toc5" tabindex="0">メニューにソート機能を追加</a></li><li><a href="#toc6" tabindex="0">ソート関数の作成</a></li></ol></li><li><a href="#toc7" tabindex="0">実行とテスト</a><ol><li><a href="#toc8" tabindex="0">ソート機能の動作確認</a><ol><li><a href="#toc9" tabindex="0">テストケース</a></li></ol></li><li><a href="#toc10" tabindex="0">他の機能との整合性</a></li></ol></li><li><a href="#toc11" tabindex="0">まとめと次のステップ</a><ol><li><a href="#toc12" tabindex="0">今回の主な学び</a></li><li><a href="#toc13" tabindex="0">次回のステップ：データのバックアップ機能</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ソート機能の設計</span></h2>



<p>データ管理ツールが成長するにつれ、単にデータを保存して検索するだけでは不十分になる場面が出てきます。特に、データが増えた場面でその重要性が高まるのが、データのソート機能です。この機能により、データを特定の順序で整列させることができ、情報の可視性やアクセシビリティが大幅に向上します。</p>



<h3 class="wp-block-heading"><span id="toc2">設計のポイント</span></h3>



<ol class="has-ex-a-background-color has-background wp-block-list">
<li><strong>ソート対象の列の選択</strong>: ユーザーがソートを行いたい列（例：日付、内容1など）を選択できるようにします。</li>



<li><strong>ソート順の指定</strong>: 昇順（asc）または降順（desc）をユーザーが選べるようにします。</li>



<li><strong>ソート実行のタイミング</strong>: データの追加、削除、検索後にもソート機能が利用できるようにします。</li>
</ol>



<h3 class="wp-block-heading"><span id="toc3">インターフェース</span></h3>



<ul class="has-ex-a-background-color has-background wp-block-list">
<li>ソート機能は、メインメニューに新たな選択肢として加えます。</li>



<li>ユーザーがソート機能を選択した場合、ソート対象の列とソート順を選択するプロンプトが表示されます。</li>
</ul>



<p>このようにして、ソート機能を設計することで、ユーザーは短時間で目的のデータにアクセスでき、作業効率が向上します。</p>



<h2 class="wp-block-heading"><span id="toc4">コードの実装</span></h2>



<p>前回までに作成したデータ管理ツールに、ソート機能を追加するための具体的なPowerShellコードとその手順について説明します。</p>



<h3 class="wp-block-heading"><span id="toc5">メニューにソート機能を追加</span></h3>



<p>まず、メインメニューにソート機能を追加します。これにより、ユーザーがソート機能を簡単にアクセスできるようになります。</p>



<pre class="wp-block-code"><code>$choice = Read-Host "操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了)"
</code></pre>



<h3 class="wp-block-heading"><span id="toc6">ソート関数の作成</span></h3>



<p>次に、ソート機能を担当する関数 <code>SortData</code> を作成します。この関数では、ユーザーにソート対象の列とソート順を選んでもらいます。</p>



<pre class="wp-block-code"><code>function SortData {
    $sortColumn = Read-Host "ソートする列を選択してください（主キー、日付、内容1、内容2、内容3）"
    $sortOrder = Read-Host "ソート順を選択してください（asc: 昇順, desc: 降順）"

    if ($sortOrder -eq 'asc') {
        $global:data = $global:data | Sort-Object $sortColumn
    } elseif ($sortOrder -eq 'desc') {
        $global:data = $global:data | Sort-Object $sortColumn -Descending
    } else {
        Write-Host "無効なソート順です。ソートは実行されません。"
        return
    }

    Write-Host "$sortColumn 列を $sortOrder でソートしました。"
}
</code></pre>



<p>この関数を <code>SortData</code> として保存し、メインメニューの選択肢に合わせて呼び出します。</p>



<pre class="wp-block-code"><code>switch ($choice) {
    ...
    '5' { SortData }
    ...
}
</code></pre>



<p>元が5の値だった箇所は以下のように6に変える必要があります。</p>



<pre class="wp-block-code"><code>'6' { Write-Host "プログラムを終了します。"; break }</code></pre>



<pre class="wp-block-code"><code>    } while ($choice -ne '6')
</code></pre>



<p>以上がソート機能の基本的なコードの実装です。このコードを前回までのプロジェクトに組み込むことで、データのソートが可能になります。</p>



<figure class="wp-block-image size-medium"><img decoding="async" width="300" height="183" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg" alt="" class="wp-image-664" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-768x468.jpg 768w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0.jpg 1000w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<h2 class="wp-block-heading"><span id="toc7">実行とテスト</span></h2>



<p>コードの実装が完了したら、次はその動作を確認しましょう。特に新しい機能を追加した場合、その機能が期待通りに動作するか、他の機能に影響を与えていないかをしっかりと確認することが重要です。</p>



<h3 class="wp-block-heading"><span id="toc8">ソート機能の動作確認</span></h3>



<ol class="has-ex-a-background-color has-background wp-block-list">
<li><strong>プログラムを実行</strong>: PowerShellでプログラムを実行します。</li>



<li><strong>ソート機能を選択</strong>: メインメニューから「5: データソート」を選択します。</li>



<li><strong>ソート対象の列を選択</strong>: 「主キー」、「日付」、「内容1」、「内容2」、「内容3」から選択します。</li>



<li><strong>ソート順を選択</strong>: 「asc: 昇順」または「desc: 降順」を選択します。</li>
</ol>



<p>このステップを踏むことで、ソート機能が正常に動作するかどうかを確認できます。</p>



<h4 class="wp-block-heading"><span id="toc9">テストケース</span></h4>



<ul class="has-ex-a-background-color has-background wp-block-list">
<li><strong>ケース1</strong>: 「主キー」で昇順にソート</li>



<li><strong>ケース2</strong>: 「日付」で降順にソート</li>



<li><strong>ケース3</strong>: 無効なソート順（asc, desc以外）を入力</li>
</ul>



<p>各テストケースで期待通りの結果が出力されるか確認しましょう。</p>



<h3 class="wp-block-heading"><span id="toc10">他の機能との整合性</span></h3>



<p>ソート機能を追加した後も、以前に実装したデータの追加、削除、検索機能が正常に動作することを確認します。</p>



<p>以上が実行とテストの基本的な手順です。これにより、新しく追加したソート機能が正確に動作すること、また他の機能に悪影響を与えていないことを確認できます。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="807" height="428" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-10.png" alt="" class="wp-image-720" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-10.png 807w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-10-300x159.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-10-768x407.png 768w" sizes="(max-width: 807px) 100vw, 807px" /></figure>



<pre class="wp-block-code"><code>データがCSVファイルから読み込まれました。
操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了): 4
検索する日付範囲を入力してください（YYYYMMDD-YYYYMMDD、空白で全範囲）:
検索するキーワードを入力してください:
検索結果：


主キー : 4
日付   : 20230907
内容1  : 111
内容2  : 222
内容3  : 333

主キー : 3
日付   : 20230906
内容1  : 222
内容2  : ee
内容3  : aa

操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了): 5
ソートする列を選択してください（主キー、日付、内容1、内容2、内容3）: 主キー
ソート順を選択してください（asc: 昇順, desc: 降順）: asc
主キー 列を asc でソートしました。
操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了): 4
検索する日付範囲を入力してください（YYYYMMDD-YYYYMMDD、空白で全範囲）:
検索するキーワードを入力してください:
検索結果：
主キー : 3
日付   : 20230906
内容1  : 222
内容2  : ee
内容3  : aa

主キー : 4
日付   : 20230907
内容1  : 111
内容2  : 222
内容3  : 333

操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了): 5
ソートする列を選択してください（主キー、日付、内容1、内容2、内容3）: 日付
ソート順を選択してください（asc: 昇順, desc: 降順）: desc
日付 列を desc でソートしました。
操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了): 4
検索する日付範囲を入力してください（YYYYMMDD-YYYYMMDD、空白で全範囲）:
検索するキーワードを入力してください:
検索結果：
主キー : 4
日付   : 20230907
内容1  : 111
内容2  : 222
内容3  : 333

主キー : 3
日付   : 20230906
内容1  : 222
内容2  : ee
内容3  : aa

操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了): 5
ソートする列を選択してください（主キー、日付、内容1、内容2、内容3）: 主キー
ソート順を選択してください（asc: 昇順, desc: 降順）: あああ
無効なソート順です。ソートは実行されません。
操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了):</code></pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>できたー</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc11">まとめと次のステップ</span></h2>



<p>今回の記事で、PowerShellを使用してデータのソート機能をデータ管理ツールに追加する方法を学びました。この機能は、多くのデータを効率よく扱うために非常に有用です。具体的なコードの実装から、その動作確認とテスト方法までを一通り解説しました。</p>



<h3 class="wp-block-heading"><span id="toc12">今回の主な学び</span></h3>



<ul class="has-ex-a-background-color has-background wp-block-list">
<li>ソート機能の設計ポイントとそのインターフェース</li>



<li>PowerShellでのソート機能のコード実装</li>



<li>新機能の動作確認とテストの重要性</li>
</ul>



<h3 class="wp-block-heading"><span id="toc13">次回のステップ：データのバックアップ機能</span></h3>



<p>次回、Part 5では、データのバックアップ機能に焦点を当てます。データを安全に管理するためには、定期的なバックアップが不可欠です。この機能によって、万が一のデータ喪失や誤操作に備え、より安全なデータ管理が可能となります。</p>



<p>このプロジェクトを通じて、PowerShellの基本から応用までを網羅し、実用的なスキルを身につけていきましょう。</p>



<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>&#x1f50d; <strong>探求を続ける</strong></p>



<p>&#x1f539; <strong><strong>次のステップへ進む</strong></strong><br>&#x1f517; <a href="https://nekomichi-coder.com/make-a-data-management-tool-part-5/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-5/">「PowerShellでデータ管理ツールを作る &#8211; Part 5: データのバックアップ機能の追加」を読む</a></p>



<p>&#x1f539; <strong>全体のまとめとガイド</strong><br>サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。<br>&#x1f517; <a href="https://nekomichi-coder.com/overview/" title="サイト全体のガイドを見る">「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る</a></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://nekomichi-coder.com/make-a-data-management-tool-part-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PowerShellでデータ管理ツールを作る &#8211; Part 3: データの検索機能の追加</title>
		<link>https://nekomichi-coder.com/make-a-data-management-tool-part-3/</link>
					<comments>https://nekomichi-coder.com/make-a-data-management-tool-part-3/#respond</comments>
		
		<dc:creator><![CDATA[猫道]]></dc:creator>
		<pubDate>Wed, 06 Sep 2023 13:26:40 +0000</pubDate>
				<category><![CDATA[データ管理ツール作成]]></category>
		<guid isPermaLink="false">https://nekomichi-coder.com/?p=706</guid>

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




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6"><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">検索機能の設計</a><ol><li><a href="#toc2" tabindex="0">検索フィールド</a></li><li><a href="#toc3" tabindex="0">検索条件</a></li><li><a href="#toc4" tabindex="0">検索結果の表示</a></li><li><a href="#toc5" tabindex="0">エラーハンドリング</a></li></ol></li><li><a href="#toc6" tabindex="0">コードの追加</a><ol><li><a href="#toc7" tabindex="0">Where-Object の説明</a></li><li><a href="#toc8" tabindex="0">複数条件でのデータ検索関数</a></li><li><a href="#toc9" tabindex="0">ソースコード全体版</a></li><li><a href="#toc10" tabindex="0">実機確認</a></li></ol></li><li><a href="#toc11" tabindex="0">まとめと次のステップ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">検索機能の設計</span></h2>



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



<h3 class="wp-block-heading"><span id="toc2">検索フィールド</span></h3>



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



<h3 class="wp-block-heading"><span id="toc3">検索条件</span></h3>



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



<h3 class="wp-block-heading"><span id="toc4">検索結果の表示</span></h3>



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



<h3 class="wp-block-heading"><span id="toc5">エラーハンドリング</span></h3>



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



<h2 class="wp-block-heading"><span id="toc6">コードの追加</span></h2>



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



<h3 class="wp-block-heading"><span id="toc7">Where-Object の説明</span></h3>



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



<h3 class="wp-block-heading"><span id="toc8">複数条件でのデータ検索関数</span></h3>



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



<pre class="wp-block-code"><code># 複数条件でのデータ検索関数
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
    }
}</code></pre>



<p><div id="__next"><div class="overflow-hidden w-full h-full relative flex z-0"><div class="relative flex h-full max-w-full flex-1 overflow-hidden"><div class="flex h-full max-w-full flex-1 flex-col"><main class="relative h-full w-full transition-width overflow-auto flex-1"><div role="presentation" class="flex h-full"><div class="flex-1 overflow-hidden"><div class="react-scroll-to-bottom--css-dxyxm-79elbk h-full dark:bg-gray-800"><div class="react-scroll-to-bottom--css-dxyxm-1n7m0yu"><div class="flex flex-col text-sm dark:bg-gray-800"><div class="group w-full text-token-text-primary border-b border-black/10 dark:border-gray-900/50 bg-gray-50 dark:bg-[#444654]" data-testid="conversation-turn-35"><div class="p-4 justify-center text-base md:gap-6 md:py-6 m-auto"><div class="flex flex-1 gap-4 text-base mx-auto md:gap-6 md:max-w-2xl lg:max-w-[38rem] xl:max-w-3xl }"><div class="relative flex w-[calc(100%-50px)] flex-col gap-1 md:gap-3 lg:w-[calc(100%-115px)]"><div class="flex flex-grow flex-col gap-3 max-w-full"><div class="min-h-[20px] flex flex-col items-start gap-3 overflow-x-auto whitespace-pre-wrap break-words"><div class="markdown prose w-full break-words dark:prose-invert light"><p>この関数では、日付範囲とキーワードを指定してデータを検索します。<code>Where-Object</code> を用いて複数の条件を組み合わせ、該当するデータをフィルタリングしています。メニューに検索オプションを追加最後に、メニューにこの新しい複数条件検索機能を追加します。</p></div></div></div></div></div></div></div></div></div></div></div></div></main></div></div></div></div></p>



<pre class="wp-block-code"><code># メニュー表示
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')
</code></pre>



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



<figure class="wp-block-image size-medium"><img decoding="async" width="300" height="183" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg" alt="" class="wp-image-664" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-768x468.jpg 768w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0.jpg 1000w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<h3 class="wp-block-heading"><span id="toc9">ソースコード全体版</span></h3>



<p>ここまでの内容を取り込みます。</p>



<pre class="wp-block-code"><code>Try {
    # 共通のパスの設定
    $commonPath = "$PSScriptRoot\.."
    
    # CSVファイル設定
    $dataFile = "$commonPath\data\data.csv"
    
    # 主キー用の定義ファイル設定
    $keyFile = "$commonPath\data\last_key.txt"
    
    # データの配列を宣言
    $global:data = @()
    
    # 主キーの初期値設定
    if (Test-Path $keyFile) {
        $newPrimaryKey = &#91;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 = &#91;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)"
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc10">実機確認</span></h3>



<figure class="wp-block-image size-full"><img decoding="async" width="979" height="512" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-7.png" alt="" class="wp-image-711" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-7.png 979w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-7-300x157.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-7-768x402.png 768w" sizes="(max-width: 979px) 100vw, 979px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="807" height="428" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-8.png" alt="" class="wp-image-712" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-8.png 807w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-8-300x159.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-8-768x407.png 768w" sizes="(max-width: 807px) 100vw, 807px" /></figure>



<p>検索できるようになりました。</p>



<h2 class="wp-block-heading"><span id="toc11">まとめと次のステップ</span></h2>



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



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



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



<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>&#x1f50d; <strong>探求を続ける</strong></p>



<p>&#x1f539; <strong><strong>次のステップへ進む</strong></strong><br>&#x1f517; <a href="https://nekomichi-coder.com/make-a-data-management-tool-part-4/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-4/">「PowerShellでデータ管理ツールを作る – Part 4: データのソート機能の追加」を読む</a></p>



<p>&#x1f539; <strong>全体のまとめとガイド</strong><br>サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。<br>&#x1f517; <a href="https://nekomichi-coder.com/overview/" title="サイト全体のガイドを見る">「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る</a></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://nekomichi-coder.com/make-a-data-management-tool-part-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PowerShellでデータ管理ツールを作る &#8211; Part 2: データの読み込み・書き込み機能の追加</title>
		<link>https://nekomichi-coder.com/make-a-data-management-tool-part-2/</link>
					<comments>https://nekomichi-coder.com/make-a-data-management-tool-part-2/#respond</comments>
		
		<dc:creator><![CDATA[猫道]]></dc:creator>
		<pubDate>Tue, 05 Sep 2023 14:47:24 +0000</pubDate>
				<category><![CDATA[データ管理ツール作成]]></category>
		<guid isPermaLink="false">https://nekomichi-coder.com/?p=678</guid>

					<description><![CDATA[目次 はじめに前回の振り返り今回の目的テンプレートの作成ToDoリスト作成の経験を活かすTry～Catch句で全体をくくる相対パスを使用する定義はなるべく上部で設定データの読み込み機能の追加概要CSVファイルの存在チェッ [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8"><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a><ol><li><a href="#toc2" tabindex="0">前回の振り返り</a></li><li><a href="#toc3" tabindex="0">今回の目的</a></li></ol></li><li><a href="#toc4" tabindex="0">テンプレートの作成</a><ol><li><a href="#toc5" tabindex="0">ToDoリスト作成の経験を活かす</a></li><li><a href="#toc6" tabindex="0">Try～Catch句で全体をくくる</a></li><li><a href="#toc7" tabindex="0">相対パスを使用する</a></li><li><a href="#toc8" tabindex="0">定義はなるべく上部で設定</a></li></ol></li><li><a href="#toc9" tabindex="0">データの読み込み機能の追加</a><ol><li><a href="#toc10" tabindex="0">概要</a></li><li><a href="#toc11" tabindex="0">CSVファイルの存在チェック</a></li><li><a href="#toc12" tabindex="0">データの読み込み</a></li><li><a href="#toc13" tabindex="0">データの格納</a></li><li><a href="#toc14" tabindex="0">主キーの自動生成と管理</a></li><li><a href="#toc15" tabindex="0">完成したコードの一部</a></li></ol></li><li><a href="#toc16" tabindex="0">データの書き込み、追加、削除機能の追加</a><ol><li><a href="#toc17" tabindex="0">操作選択のメニュー</a></li><li><a href="#toc18" tabindex="0">データの書き込み、追加、削除関数</a></li></ol></li><li><a href="#toc19" tabindex="0">ファイル配置とソースコード全体版</a><ol><li><a href="#toc20" tabindex="0">ファイル配置</a></li><li><a href="#toc21" tabindex="0">ソースコード（全体版）</a></li><li><a href="#toc22" tabindex="0">実機検証</a></li></ol></li><li><a href="#toc23" tabindex="0">CSVについて</a><ol><li><a href="#toc24" tabindex="0">CSVとは</a></li><li><a href="#toc25" tabindex="0">なぜCSV形式か</a></li></ol></li><li><a href="#toc26" tabindex="0">CSV形式でのデータ保存</a><ol><li><a href="#toc27" tabindex="0">CSVのカラム設定</a></li><li><a href="#toc28" tabindex="0">CSV形式でのデータ保存方法</a></li></ol></li><li><a href="#toc29" tabindex="0">まとめと次回予告</a><ol><li><a href="#toc30" tabindex="0">今回の成果</a></li><li><a href="#toc31" tabindex="0">次回予告</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<h3 class="wp-block-heading"><span id="toc2">前回の振り返り</span></h3>



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



<h3 class="wp-block-heading"><span id="toc3">今回の目的</span></h3>



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



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



<h2 class="wp-block-heading"><span id="toc4">テンプレートの作成</span></h2>



<h3 class="wp-block-heading"><span id="toc5">ToDoリスト作成の経験を活かす</span></h3>



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



<h3 class="wp-block-heading"><span id="toc6">Try～Catch句で全体をくくる</span></h3>



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



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



<h3 class="wp-block-heading"><span id="toc7">相対パスを使用する</span></h3>



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



<pre class="wp-block-code"><code>$commonPath = "$PSScriptRoot\.."
</code></pre>



<h3 class="wp-block-heading"><span id="toc8">定義はなるべく上部で設定</span></h3>



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



<pre class="wp-block-code"><code>$commonPath = "$PSScriptRoot\.."
$csvFile = "$commonPath\data\data.csv"
</code></pre>



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



<h2 class="wp-block-heading"><span id="toc9">データの読み込み機能の追加</span></h2>



<h3 class="wp-block-heading"><span id="toc10">概要</span></h3>



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



<h3 class="wp-block-heading"><span id="toc11">CSVファイルの存在チェック</span></h3>



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



<pre class="wp-block-code"><code>if (-not (Test-Path $csvFile)) {
    New-Item $csvFile -ErrorAction Stop &gt;$null
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc12">データの読み込み</span></h3>



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



<pre class="wp-block-code"><code>$csvData = Import-Csv -Path $csvFile
</code></pre>



<h3 class="wp-block-heading"><span id="toc13">データの格納</span></h3>



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



<pre class="wp-block-code"><code>$records = @()
$records += $csvData
</code></pre>



<h3 class="wp-block-heading"><span id="toc14">主キーの自動生成と管理</span></h3>



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



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



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



<pre class="wp-block-code"><code># 主キーの定義ファイルのパス設定
$keyFile = "$commonPath\data\last_key.txt"

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

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

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



<h3 class="wp-block-heading"><span id="toc15">完成したコードの一部</span></h3>



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



<pre class="wp-block-code"><code>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 &gt;$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)"
}
</code></pre>



<figure class="wp-block-image size-medium"><img decoding="async" width="300" height="183" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg" alt="" class="wp-image-664" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-768x468.jpg 768w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0.jpg 1000w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<h2 class="wp-block-heading"><span id="toc16">データの書き込み、追加、削除機能の追加</span></h2>



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



<h3 class="wp-block-heading"><span id="toc17">操作選択のメニュー</span></h3>



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



<pre class="wp-block-code"><code># メニュー表示
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')
</code></pre>



<h3 class="wp-block-heading"><span id="toc18">データの書き込み、追加、削除関数</span></h3>



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



<pre class="wp-block-code"><code># データ書き込み関数
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 = &#91;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 のデータが削除されました。"
}
</code></pre>



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



<h2 class="wp-block-heading"><span id="toc19">ファイル配置とソースコード全体版</span></h2>



<h3 class="wp-block-heading"><span id="toc20">ファイル配置</span></h3>



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



<figure class="wp-block-image size-full"><img decoding="async" width="819" height="581" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image.png" alt="" class="wp-image-686" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image.png 819w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-300x213.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-768x545.png 768w" sizes="(max-width: 819px) 100vw, 819px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="819" height="581" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-1.png" alt="" class="wp-image-687" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-1.png 819w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-1-300x213.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-1-768x545.png 768w" sizes="(max-width: 819px) 100vw, 819px" /></figure>



<h3 class="wp-block-heading"><span id="toc21">ソースコード（全体版）</span></h3>



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



<pre class="wp-block-code"><code>dataMng.ps1</code></pre>



<pre class="wp-block-code"><code>Try {
    # 共通のパスの設定
    $commonPath = "$PSScriptRoot\.."
    
    # CSVファイル設定
    $dataFile = "$commonPath\data\data.csv"
    
    # 主キー用の定義ファイル設定
    $keyFile = "$commonPath\data\last_key.txt"
    
    # データの配列を宣言
    $global:data = @()
    
    # 主キーの初期値設定
    if (Test-Path $keyFile) {
        $newPrimaryKey = &#91;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 = &#91;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)"
}
</code></pre>



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



<pre class="wp-block-code"><code>dataMng.bat</code></pre>



<pre class="wp-block-code"><code>@echo off
powershell.exe -ExecutionPolicy RemoteSigned "%~dp0bin\dataMng.ps1"

pause
</code></pre>



<h3 class="wp-block-heading"><span id="toc22">実機検証</span></h3>



<p>実際に動かしてみます。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="979" height="512" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-3.png" alt="" class="wp-image-697" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-3.png 979w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-3-300x157.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-3-768x402.png 768w" sizes="(max-width: 979px) 100vw, 979px" /></figure>



<p>ファイルが作成されました。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="819" height="581" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-4.png" alt="" class="wp-image-698" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-4.png 819w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-4-300x213.png 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-4-768x545.png 768w" sizes="(max-width: 819px) 100vw, 819px" /></figure>



<figure class="wp-block-image size-full"><img decoding="async" width="735" height="605" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-5.png" alt="" class="wp-image-699" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/image-5.png 735w, https://nekomichi-coder.com/wp-content/uploads/2023/09/image-5-300x247.png 300w" sizes="(max-width: 735px) 100vw, 735px" /></figure>



<p>保存されました。</p>



<h2 class="wp-block-heading"><span id="toc23">CSVについて</span></h2>



<h3 class="wp-block-heading"><span id="toc24">CSVとは</span></h3>



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



<h3 class="wp-block-heading"><span id="toc25">なぜCSV形式か</span></h3>



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



<ol class="has-ex-a-background-color has-background wp-block-list">
<li><strong>互換性の確保</strong>: CSV形式は多くのプログラムやシステムで広くサポートされているため、他のツールとの連携が容易になります。</li>



<li><strong>データの可読性</strong>: CSV形式はテキストベースであるため、人間が読むことも、編集することも容易です。</li>



<li><strong>効率的なデータ操作</strong>: PowerShellには<code>Import-Csv</code>と<code>Export-Csv</code>といった、CSV形式のデータを効率的に扱うためのコマンドレットが用意されています。これにより、データの読み書きが非常にスムーズに行えます。</li>
</ol>



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



<h2 class="wp-block-heading"><span id="toc26">CSV形式でのデータ保存</span></h2>



<h3 class="wp-block-heading"><span id="toc27">CSVのカラム設定</span></h3>



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



<ol class="has-ex-a-background-color has-background wp-block-list">
<li>主キー: データの一意な識別子</li>



<li>日付: データが作成された日付（YYYYMMDD形式）</li>



<li>内容1, 内容2, 内容3: 任意のデータフィールド</li>
</ol>



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



<pre class="wp-block-code"><code>$newData = &#91;PSCustomObject]@{
    '主キー' = $primaryKey
    '日付' = $date
    '内容1' = $content1
    '内容2' = $content2
    '内容3' = $content3
}
</code></pre>



<h3 class="wp-block-heading"><span id="toc28">CSV形式でのデータ保存方法</span></h3>



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



<pre class="wp-block-code"><code>$global:data | Export-Csv -Path $dataFile -NoTypeInformation  -Encoding Default
</code></pre>



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



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



<h2 class="wp-block-heading"><span id="toc29">まとめと次回予告</span></h2>



<h3 class="wp-block-heading"><span id="toc30">今回の成果</span></h3>



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



<h3 class="wp-block-heading"><span id="toc31">次回予告</span></h3>



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



<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>&#x1f50d; <strong>探求を続ける</strong></p>



<p>&#x1f539; <strong><strong>次のステップへ進む</strong></strong><br>&#x1f517; <a href="https://nekomichi-coder.com/make-a-data-management-tool-part-3/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-3/">「PowerShellでデータ管理ツールを作る &#8211; Part 3: データの検索機能の追加」を読む</a></p>



<p>&#x1f539; <strong>全体のまとめとガイド</strong><br>サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。<br>&#x1f517; <a href="https://nekomichi-coder.com/overview/" title="サイト全体のガイドを見る">「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る</a></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://nekomichi-coder.com/make-a-data-management-tool-part-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PowerShellでデータ管理ツールを作る &#8211; Part 1: ツールの設計と基本機能の作成</title>
		<link>https://nekomichi-coder.com/make-a-data-management-tool-part-1/</link>
					<comments>https://nekomichi-coder.com/make-a-data-management-tool-part-1/#respond</comments>
		
		<dc:creator><![CDATA[猫道]]></dc:creator>
		<pubDate>Mon, 04 Sep 2023 15:02:39 +0000</pubDate>
				<category><![CDATA[データ管理ツール作成]]></category>
		<guid isPermaLink="false">https://nekomichi-coder.com/?p=657</guid>

					<description><![CDATA[目次 はじめに目的ToDoリストツールとの違い既存の知識をどう活かすか上司からの依頼基本機能の設計データの追加・削除データの検索機能データのソート機能安全性（オプション）上司からのフィードバック次のステップ: データの読 [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10"><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a><ol><li><a href="#toc2" tabindex="0">目的</a></li><li><a href="#toc3" tabindex="0">ToDoリストツールとの違い</a></li><li><a href="#toc4" tabindex="0">既存の知識をどう活かすか</a></li></ol></li><li><a href="#toc5" tabindex="0">上司からの依頼</a></li><li><a href="#toc6" tabindex="0">基本機能の設計</a><ol><li><a href="#toc7" tabindex="0">データの追加・削除</a></li><li><a href="#toc8" tabindex="0">データの検索機能</a></li><li><a href="#toc9" tabindex="0">データのソート機能</a></li><li><a href="#toc10" tabindex="0">安全性（オプション）</a></li></ol></li><li><a href="#toc11" tabindex="0">上司からのフィードバック</a></li><li><a href="#toc12" tabindex="0">次のステップ: データの読み込み・書き込み</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>今回の記事では、「PowerShellを用いてデータ管理ツールを作成する」プロジェクトに挑戦します。このデータ管理ツールは、例えば顧客情報やプロジェクトの進捗、さらには個人的なToDoリストまで、多様なデータを効率よく管理するためのものです。</p>



<h3 class="wp-block-heading"><span id="toc2">目的</span></h3>



<p>このデータ管理ツールの主な目的は、データの追加、表示、削除、そして保存といった基本的な機能を網羅することです。これにより、日常業務で頻繁に行うデータ管理作業を効率化することができます。</p>



<h3 class="wp-block-heading"><span id="toc3">ToDoリストツールとの違い</span></h3>



<p>前回のToDoリストツールは、シンプルな構造で、扱うカラムが1つしかなく、ソート機能もありませんでした。これは基本的なタスク管理には十分でしたが、より複雑なデータ管理には対応していません。</p>



<p>一方で、今回のデータ管理ツールは、より多様なデータ形式と複数のユーザーケースを考慮して設計されています。例えば、顧客情報やプロジェクトの進捗といった、より複雑なデータ構造を扱うことができます。</p>



<p>さらに、データのソート機能も考慮に入れています。このような拡張性があるため、今回のツールはさまざまな用途で使用できます。</p>



<h3 class="wp-block-heading"><span id="toc4">既存の知識をどう活かすか</span></h3>



<p>前回の記事で紹介したToDoリスト作成ツールでは、エラーハンドリングや相対パスの設定、関数の定義といった基本的なプログラミングの概念に触れました。これらの知識は、新しいデータ管理ツール作成にも非常に役立ちます。</p>



<p>特に、エラーハンドリングはデータの安全性を保つ上で欠かせないスキルです。また、相対パスの設定は、ツールが異なる環境でも柔軟に動作するようにするために重要です。これらの既存の知識を活かしながら、より高度で実用的なデータ管理ツールを作成していきましょう。</p>



<h2 class="wp-block-heading"><span id="toc5">上司からの依頼</span></h2>



<p>新しいプロジェクトが始まると、多くの場合具体的な要件や機能の依頼があります。このデータ管理ツールも例外ではありません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>新しいデータ管理ツールを作ってほしいんだ。使い勝手がいいといいな。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>使い勝手がいい？データの追加や削除が簡単にできるように、ということですか？</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>うーん、そうだね。それも大事だけど、データが増えたときに探しやすいとか、データを整理してソートできるといいな。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>他にはなにかないですか？最初にしっかり決めておかないと、後で手戻りがあるのは嫌です。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>それは確かに。じゃあ、データの追加・削除、検索機能、そしてデータの整理とソート機能が必要だね。安全性については、できれば考慮して。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>わかりました。それでは、これらの要件を元に設計を進めていきます。</p>
</div></div>



<p>このやり取りを通じて、猫道は上司からのあいまいな要件を具体的なものに落とし込むことができました。このステップは、後で手戻りが発生するリスクを減らすために非常に重要です。しっかりと要件を定義してから開発に取り掛かることで、スムーズなプロジェクト進行が期待できます。</p>



<h2 class="wp-block-heading"><span id="toc6">基本機能の設計</span></h2>



<p>上司からの要件を元に、新しいデータ管理ツールで実装する基本機能について考えてみましょう。この段階でしっかりと設計を行うことで、後の開発がスムーズに進むでしょう。</p>



<h3 class="wp-block-heading"><span id="toc7">データの追加・削除</span></h3>



<p>最も基本的な機能として、ユーザーが簡単にデータを追加・削除できるようにします。PowerShellコンソール上で操作するように設計します。</p>



<h3 class="wp-block-heading"><span id="toc8">データの検索機能</span></h3>



<p>データが増えてきたときに、特定のデータを素早く見つけられるように検索機能を実装します。キーワードや日付範囲での検索が可能となるように設計します。</p>



<h3 class="wp-block-heading"><span id="toc9">データのソート機能</span></h3>



<p>ソート機能を用いてデータを任意の順序で表示できるようにします。これにより、ユーザーが目的のデータに素早くアクセスできます。</p>



<h3 class="wp-block-heading"><span id="toc10">安全性（オプション）</span></h3>



<p>「上司」からは「できれば」という要件でしたが、データの安全性も考慮に入れます。具体的には、データのバックアップや暗号化などが考えられます。ただし、これは後の「改善する」シリーズで詳しく取り上げることとします。</p>



<p>以上が新しいデータ管理ツールで実装する基本機能の概要です。</p>



<figure class="wp-block-image size-medium"><img decoding="async" width="300" height="183" src="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg" alt="" class="wp-image-664" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-300x183.jpg 300w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0-768x468.jpg 768w, https://nekomichi-coder.com/wp-content/uploads/2023/09/150837_0.jpg 1000w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<h2 class="wp-block-heading"><span id="toc11">上司からのフィードバック</span></h2>



<p>基本機能の設計が完了したところで、上司にフィードバックを求めました。このステップは、設計段階での誤解や不足を早期に修正するために重要です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>設計を見たよ。全体的にはいい感じだね。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>ありがとうございます。何か気になる点や改善点はありますか？</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>うーん、データはCSV形式で保存しようか。使い道が決まっていないから、いったん仮で用意してみて。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>わかりました。作るときに一度見せますね。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>あと、データ量によっては、パフォーマンスも考慮しないといけないかもしれない。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-11 sbs-stn sbp-r sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4667.jpeg" alt="猫道" class="speech-icon-image"/></figure><div class="speech-name">猫道</div></div><div class="speech-balloon">
<p>時間があればパフォーマンスの最適化についても頑張ってみます。</p>
</div></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-13 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/IMG_4669.jpeg" alt="上司" class="speech-icon-image"/></figure><div class="speech-name">上司</div></div><div class="speech-balloon">
<p>うん、それでいこうか。</p>
</div></div>



<p>このように、上司からのフィードバックを元に設計を微調整することで、より使い勝手の良いツールが完成するでしょう。このプロセスは、後で手戻りが発生するリスクを減らすためにも非常に重要です。</p>



<h2 class="wp-block-heading"><span id="toc12">次のステップ: データの読み込み・書き込み</span></h2>



<p>この記事では、データ管理ツールの基本設計と上司からのフィードバックについて考察しました。次に進むステップは、データの読み込み・書き込み機能の実装です。この機能は、データの追加・削除を含む広範な操作に対応し、ユーザーが実際にデータを操作する基盤となります。</p>



<p>次回の記事では、このデータの読み込み・書き込み機能に焦点を当て、具体的なコード例とともにその実装方法を詳しく解説します。次回の記事もお楽しみに。</p>



<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>&#x1f50d; <strong>探求を続ける</strong></p>



<p>&#x1f539; <strong><strong>次のステップへ進む</strong></strong><br>&#x1f517; <a href="https://nekomichi-coder.com/make-a-data-management-tool-part-2/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-2/">「PowerShellでデータ管理ツールを作る &#8211; Part 2: データの読み込み・書き込み機能の追加」を読む</a></p>



<p>&#x1f539; <strong>全体のまとめとガイド</strong><br>サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。<br>&#x1f517; <a href="https://nekomichi-coder.com/overview/" title="サイト全体のガイドを見る">「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る</a></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://nekomichi-coder.com/make-a-data-management-tool-part-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PowerShellでのデータ管理ツールの設計と実装の全手順</title>
		<link>https://nekomichi-coder.com/all-steps-for-data-management-tools/</link>
					<comments>https://nekomichi-coder.com/all-steps-for-data-management-tools/#respond</comments>
		
		<dc:creator><![CDATA[猫道]]></dc:creator>
		<pubDate>Mon, 07 Aug 2023 05:42:22 +0000</pubDate>
				<category><![CDATA[データ管理ツール作成]]></category>
		<guid isPermaLink="false">https://nekomichi-coder.com/?p=62</guid>

					<description><![CDATA[目次 はじめにデータ管理ツール作成のステップバイステップガイド概要詳細なガイドデータ管理ツールの作成ソースコード（完成版）結論 はじめに プログラミングに興味があるけれど、どこから始めたらいいかわからないという方は多いの [&#8230;]]]></description>
										<content:encoded><![CDATA[

  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12"><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに</a></li><li><a href="#toc2" tabindex="0">データ管理ツール作成のステップバイステップガイド</a><ol><li><a href="#toc3" tabindex="0">概要</a></li><li><a href="#toc4" tabindex="0">詳細なガイド</a><ol><ol><li><a href="#toc5" tabindex="0">データ管理ツールの作成</a></li></ol></li></ol></li></ol></li><li><a href="#toc6" tabindex="0">ソースコード（完成版）</a></li><li><a href="#toc7" tabindex="0">結論</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p>プログラミングに興味があるけれど、どこから始めたらいいかわからないという方は多いのではないでしょうか。また、自分がプログラミングに向いているかどうか不安を感じている方もいるかもしれません。</p>



<p>そんな方々に向けて、<strong><span class="marker-under">この記事ではPowerShellを用いたデータ管理ツールの設計と実装について解説します。</span></strong>PowerShellはWindowsに標準で搭載されているツールで、環境構築の手間がほとんどありません。そのため、プログラミング初心者でもすぐに始めることができます。</p>



<p><strong>この記事を通じて、データ管理ツールの設計と実装の基本を学び、自分自身のプログラミングスキルを試す機会を得ることができます。</strong>また、自分がプログラミングに向いているかどうかを判断する一助となるでしょう。</p>



<p>さらに、プログラミングの理解を深めることで、エンジニアとしての自信をつけることができます。自分の可能性を試す一歩を踏み出しましょう。</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-check block-box">
<p>本記事は、PowerShellを用いたデータ管理ツールの設計と実装について解説します。ただし、「PowerShellを活用したToDoリスト作成の全手順」を理解していることが前提となります。その記事を先に読むことで、本記事の内容がより理解しやすくなります。まだ読んでいない方は、先に<a href="https://nekomichi-coder.com/all-the-steps-to-create-a-to-do-list/" title="「PowerShellを活用したToDoリスト作成の全手順」">「PowerShellを活用したToDoリスト作成の全手順」</a>をお読みください。</p>
</div>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-check block-box">
<p>ここで共有しているコードは学習を支援するためのものです。自分の環境で試す際は、内容をしっかりと理解し、影響の出ない安全な環境で行ってください。具体的な詳細は当サイトの<a href="https://nekomichi-coder.com/disclaimer/">免責事項</a>をお読みいただけますと幸いです。</p>
</div>



<h2 class="wp-block-heading"><span id="toc2">データ管理ツール作成のステップバイステップガイド</span></h2>



<h3 class="wp-block-heading"><span id="toc3">概要</span></h3>



<p><strong><span class="marker-under">実際のデータ管理ツールを作成します。</span></strong>この過程で、データの読み込み・書き込み、データの検索、ソートなど、データ管理に必要な機能を一つ一つ実装していきます。</p>



<p>さらに、ツールの移植性を向上させたり、データのバックアップ機能を追加したり、ユーザーインターフェースを改善したりといった、ツールをより実用的にするための改善を行います。</p>



<p>このように、PowerShellを用いて実際のデータ管理ツールを作成する過程を通じて、プログラミングの理解を深めることができます。また、<strong>自分自身でツールを作成する経験を通じて、エンジニアとしての自信をつけることができます。</strong></p>



<p>この経験は、プログラミング初心者が自分の向き不向きを判断し、自信をつけるための一助となるでしょう。</p>



<h3 class="wp-block-heading"><span id="toc4">詳細なガイド</span></h3>



<p>以下の記事では、PowerShellを用いたデータ管理ツールの設計から実装の具体的な手順を詳しく解説しています。それぞれの記事タイトルをクリックすると、該当の記事にジャンプします。</p>



<h5 class="wp-block-heading"><span id="toc5">データ管理ツールの作成</span></h5>



<p>[<a href="https://nekomichi-coder.com/make-a-data-management-tool-part-1/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-1/">PowerShellでデータ管理ツールを作る &#8211; Part 1: ツールの設計と基本機能の作成</a>]<br><strong>データ管理ツールの設計と基本機能の作成</strong>について学びます。ツールの設計思想から始め、基本的な機能の実装方法を解説します。</p>



<p>[<a href="https://nekomichi-coder.com/make-a-data-management-tool-part-2/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-2/">PowerShellでデータ管理ツールを作る &#8211; Part 2: データの読み込み・書き込み機能の追加</a>]<br><strong>データの読み込みと書き込み機能の追加方法</strong>を解説します。データの永続化が可能になり、より実用的なツールへと進化します。</p>



<p>[<a href="https://nekomichi-coder.com/make-a-data-management-tool-part-3/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-3/">PowerShellでデータ管理ツールを作る &#8211; Part 3: データの検索機能の追加</a>]<br><strong>データの検索機能の実装方法</strong>を学びます。大量のデータから必要な情報を素早く見つけ出すための方法を解説します。</p>



<p>[<a href="https://nekomichi-coder.com/make-a-data-management-tool-part-4/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-4/">PowerShellでデータ管理ツールを作る – Part 4: データのソート機能の追加</a>]<br><strong>ソート機能の追加方法</strong>を解説します。データを効率的に管理するための機能を追加します。</p>



<p>[<a href="https://nekomichi-coder.com/make-a-data-management-tool-part-5/" data-type="link" data-id="https://nekomichi-coder.com/make-a-data-management-tool-part-5/">PowerShellでデータ管理ツールを作る &#8211; Part 5: データのバックアップ機能の追加</a>]<br><strong>データのバックアップ機能の追加方法</strong>を解説します。データの安全性を確保するための重要な機能を追加します。</p>



<p>これらの記事を通じて、PowerShellを用いたデータ管理ツールの作成と改善の全体像を把握することができます。</p>



<figure class="wp-block-image size-medium"><img decoding="async" width="300" height="254" src="https://nekomichi-coder.com/wp-content/uploads/2023/08/150624_0-300x254.jpg" alt="" class="wp-image-598" srcset="https://nekomichi-coder.com/wp-content/uploads/2023/08/150624_0-300x254.jpg 300w, https://nekomichi-coder.com/wp-content/uploads/2023/08/150624_0-768x651.jpg 768w, https://nekomichi-coder.com/wp-content/uploads/2023/08/150624_0.jpg 1006w" sizes="(max-width: 300px) 100vw, 300px" /></figure>



<h2 class="wp-block-heading"><span id="toc6">ソースコード（完成版）</span></h2>



<p>シリーズを通じて、以下のソースを作成していきます。</p>



<pre class="wp-block-code"><code>Try {
    # 共通のパスの設定
    $commonPath = "$PSScriptRoot\.."
    
    # CSVファイル設定
    $dataFile = "$commonPath\data\data.csv"
    
    # 主キー用の定義ファイル設定
    $keyFile = "$commonPath\data\last_key.txt"
    
    # データの配列を宣言
    $global:data = @()
    
    # 主キーの初期値設定
    if (Test-Path $keyFile) {
        $newPrimaryKey = &#91;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 SaveData {
        $global:data | Export-Csv -Path $dataFile -NoTypeInformation -Encoding Default
        Write-Host "データがCSVファイルに保存されました。"
        
        # バックアップの作成
        $backupFileName = "data_" + (Get-Date -Format "yyyyMMdd") + ".csv"
        $backupPath = "$commonPath\bk\$backupFileName"
        Copy-Item $dataFile -Destination $backupPath
        Write-Host "バックアップが作成されました。"
        
        # 古いバックアップファイルの削除
        $limitDate = (Get-Date).AddDays(-5).ToString("yyyyMMdd")
        Get-ChildItem "$commonPath\bk\" -Filter "data_*.csv" | ForEach-Object {
            $fileDate = $_.Name.Substring(5, 8)
            if (&#91;int]$fileDate -le &#91;int]$limitDate) {
                Remove-Item $_.FullName
                Write-Host "$($_.Name) が削除されました。"
            }
        }
    
    }

    
    # データ追加関数
    function AddData {
        # 主キーの更新
        $newPrimaryKey++
        
        $date = Read-Host "日付を入力してください（YYYYMMDD形式）"
        $content1 = Read-Host "内容1を入力してください"
        $content2 = Read-Host "内容2を入力してください"
        $content3 = Read-Host "内容3を入力してください"
        
        $newData = &#91;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
        }
    }
    
    #ソート関数
    function SortData {
        $sortColumn = Read-Host "ソートする列を選択してください（主キー、日付、内容1、内容2、内容3）"
        $sortOrder = Read-Host "ソート順を選択してください（asc: 昇順, desc: 降順）"
    
        if ($sortOrder -eq 'asc') {
            $global:data = $global:data | Sort-Object $sortColumn
        } elseif ($sortOrder -eq 'desc') {
            $global:data = $global:data | Sort-Object $sortColumn -Descending
        } else {
            Write-Host "無効なソート順です。ソートは実行されません。"
            return
        }
    
        Write-Host "$sortColumn 列を $sortOrder でソートしました。"
    }
            
    # メニュー表示
    do {
        $choice = Read-Host "操作を選択してください (1: データ追加, 2: データ削除, 3: データ保存, 4: データ検索, 5: データソート, 6: 終了)"
        switch ($choice) {
            '1' { AddData }
            '2' { RemoveData }
            '3' { SaveData }
            '4' { MultiSearchData }
            '5' { SortData }
            '6' { Write-Host "プログラムを終了します。"; break }
            default { Write-Host "無効な選択です。再度選択してください。" }
        }
    } while ($choice -ne '6')
    
} Catch {
    # エラーメッセージ出力
    Write-Host "予期せぬエラーが発生しました: $($_.Exception.Message)"
}
</code></pre>



<h2 class="wp-block-heading"><span id="toc7">結論</span></h2>



<p><strong><span class="marker-under">PowerShellを用いたプログラミングは、初心者でも手軽に始められるため、エンジニアとしてのキャリアをスタートするのに最適です。</span></strong>特に、<strong>Windows環境で直接動作するため、環境構築の手間がほとんどないのが大きな利点</strong>です。JavaやPythonなどの他の言語では、環境構築だけで挫折してしまうこともありますが、PowerShellならその心配はありません。</p>



<p>また、PowerShellを用いてデータ管理ツールを自分で作成する経験は、プログラミングの理解を深めるだけでなく、自分自身のスキルを試す機会にもなります。これにより、自分がプログラミングに向いているかどうかを判断することができます。</p>



<p>さらに、<strong><span class="marker-under">自分でツールを作成することで、エンジニアとしての自信をつけることができます。</span></strong>自分の手で何かを作り上げる経験は、自己効力感を高め、新たな挑戦へのモチベーションを引き出します。</p>



<p>PowerShellでプログラミングを始めて、自分の可能性を試してみませんか？エンジニアとしてのキャリアをスタートする一歩を踏み出しましょう。</p>



<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>&#x1f50d; <strong>探求を続ける</strong></p>



<p>&#x1f539; <strong>全体のまとめとガイド</strong><br>サイト全体の内容や、他の関連記事をチェックして、学びをさらに深めましょう。<br>&#x1f517; <a href="https://nekomichi-coder.com/overview/" title="サイト全体のガイドを見る">「PowerShellを使ったプログラム作成とキャリア開発ガイド」を見る</a></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://nekomichi-coder.com/all-steps-for-data-management-tools/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
