DBの修正前後の結果を比較する


# やりたいこと
Tsvファイルに出力した結果を使用し、DBの修正前後の差分を出力する。

# スクリプト
Tsvファイルを2つ選択し、結果をExcelファイルに出力

```TsvFileCompare.ps1
using namespace System.Text;
using namespace System.windows.forms;
using namespace System.Runtime.InteropServices;
using namespace Microsoft.Office.Interop;

Add-Type -AssemblyName "System.windows.forms";
Add-Type -AssemblyName "Microsoft.Office.Interop.Excel";

# -------------------------------
# 比較対象の取得
# -------------------------------
   
# ダイアログ生成
$clsDialog                  = [OpenFileDialog]::New();
$clsDialog.Filter           = "Tsvファイル(*.tsv)|*.tsv"
$clsDialog.InitialDirectory = $PSCommandPath
$clsDialog.Title            = "Tsvファイルを選択してください"
    
# 1つ目のファイル取得 
Write-Host "比較対象の1つ目のファイルを選択してください"
if($clsDialog.ShowDialog() -eq [DialogResult]::OK)
{
    $FilePathA = $clsDialog.FileName
}
else
{
    exit; # 終了
}

# 2つ目のファイル取得 
Write-Host "比較対象の2つ目のファイルを選択してください"
if($clsDialog.ShowDialog() -eq [DialogResult]::OK)
{
    $FilePathB = $clsDialog.FileName
}
else
{
    exit; # 終了
}
    
# -------------------------------
# ファイル比較
# -------------------------------

# データ取得
$FileA = Get-Content $FilePathA
$FileB = Get-Content $FilePathB
    
# ファイル比較
#　$Result = Compare-Object $FileA $FileB -IncludeEqual # 変更のない行も取得
$Result =Compare-Object $FileA $FileB ;

# 差分取得
$DiffA  = @();
$DiffB  = @();
foreach($item in $Result)
{
    # 結果をもとにファイルごとの差分を取得
    switch($item.SideIndicator)
    {
        "=>"{$DiffA  += $item.InputObject}　# FileAにあってFileBにない行
        "<="{$DiffB  += $item.InputObject}　# FileBにあってFileAにない行
        default{}
    }
}
# 差分なしは終了
if($Result -eq $null)
{
    Write-Host "差分なし"
    Read-Host "終了するにはEnterキーを押してください"
    exit;
}

# -------------------------------
# Excel起動
# -------------------------------
$ExcelApp               = New-Object -ComObject Excel.Application;
$ExcelApp.Visible       = $false;  　　　　　　　　　 # Excel画面非表示
$ExcelApp.DisplayAlerts = $false; 　　　　　　　　　　# 警告メッセージ非表示
$WorkBook 　　　　　　　= $ExcelApp.Workbooks.Add();　# Bookの追加処理

# 1つ目のシート取得
$Sheet = $ExcelApp.WorkSheets.Item(1);

# -------------------------------
# 差分結果を並べて出力
# -------------------------------
# 列数と最大行数の取得
$iColumnCount  = $DiffA[0].Split("`t").Count
$iRowCount     = [Math]::Max($DiffA.Count,$DiffB.Count)
    
# 文字化け回避のため、文字コードをSJISに変更する。
$OutputEncoding = [Console]::OutputEncoding

# クリップボードを使用し値をA1に貼り付け
$Sheet.Activate();
$Sheet.Cells(1,1).Select() | Out-Null;
$DiffA | clip;
$Sheet.paste();
    
# クリップボードを使用し値を隣に貼り付け
$Sheet.Activate();
$Sheet.Cells(1,1 + $iColumnCount).Select() | Out-Null;
$DiffB | clip;
$Sheet.paste();

# 文字コードを戻す
$OutputEncoding = [ASCIIEncoding]::New();
    
# 関数作成
$MinusCount1 = $iColumnCount * 2;
$MinusCount2 = $iColumnCount;
$Formula ="=(INDIRECT(`"RC[-$MinusCount1]`",FALSE)) = (INDIRECT(`"RC[-$MinusCount2]`",FALSE))";

# 差分箇所明瞭化の関数を結果の隣に貼り付け
$PastePosition1 = ($iColumnCount * 2) + 1;
$PastePosition2 = $iColumnCount * 3;
$Sheet.Range($Sheet.Cells(1 ,$PastePosition1),$Sheet.Cells($iRowCount,$PastePosition2)) = $Formula;

# 条件書式追加(関数がFalseとなる項目を強調)
$FormatCondition = $sheet.Range($Sheet.Cells(1 ,$PastePosition1),$Sheet.Cells($iRowCount,$PastePosition2)).FormatConditions.Add([Excel.XlFormatConditionType]::xlCellValue,[Excel.XlFormatConditionOperator]::xlEqual,"false");
$FormatCondition.Font.Bold            = $true; # 太字
$FormatCondition.Interior.ColorIndex  = 6;　　 # 背景色黄色

# Excel保存
$strPath = Join-Path (Split-Path -Parent $PSCommandPath) "TSV比較結果.xlsx"
$WorkBook.SaveAs($strPath);
Write-Host "結果を出力しました。$strPath";

# Excel解放
$ExcelApp.Quit();
[Marshal]::ReleaseComObject($Sheet)   | Out-Null;
[Marshal]::ReleaseComObject($WorkBook)| Out-Null;
[Marshal]::ReleaseComObject($ExcelApp)| Out-Null;

# 終了確認メッセージ
Read-Host "終了するにはEnterキーを押してください"
```