【PowerShell】AccessのテーブルデータをCSVファイルにエクスポートするには②

この記事では、AccessのテーブルデータをCSVファイルにエクスポートする方法についてご説明します。

【動画】AccessのテーブルデータをCSVファイルにエクスポートする実際の動き

本題に入る前に、まずは次の動画をご覧ください。


PowershellからAccessのインスタンスを生成してTransferTextメソッドを実行し、AccessのテーブルデータをCSVファイルにエクスポートします。

コードの流れ

STEP.1
Accessデータベースに接続して操作を行うためのAccessアプリケーションのインスタンスを生成する
Accessデータベースに接続して操作を行うためのAccessアプリケーションのインスタンスを生成します。
STEP.2
Accessのデータベースファイルに接続する
Accessのデータベースファイルに接続します。
STEP.3
CSVファイルのデータをエクスポートする
CSVファイルのデータをエクスポートします。
STEP.4
Accessのデータベースファイルの接続を閉じる
Accessのデータベースファイルの接続を閉じます。
STEP.5
Accessを終了する
Accessを終了します。
STEP.6
COMオブジェクトへの参照を解放する
COMオブジェクトへの参照を解放します。

Accessのデータベースファイルの例

今回は下のAccessのデータベースファイルを用意しました。

Accessのデータベースに「t_item」のテーブルが存在しています。

今回はこの「t_item」のテーブルデータをCSVファイルにエクスポートします。

エクスポートしたCSVファイルは下のとおりです。

「t_item」のテーブルデータがCSVファイルに出力されています。

PowerShellのコード(例)

注意
今回のコードはCOMオブジェクトを扱うので、コードが終了した後にAccessのプロセスが残っていないか確認・テストを行ってから自己責任でご参照・利用ください。
# フォルダパスを設定する
$folderPath = "C:\work\10_勉強\18_PowerShell\0006\"

# データベースファイル名を設定する
$accessDB = $folderPath + "0006.mdb"

# 取得したデータを出力するCSVファイル名を設定する
$csvFile = $folderPath + "data.csv"

# エクスポートするデータのテーブル名を設定する
$tableName = "t_item"

# Accessデータベースに接続して操作を行うためのAccessアプリケーションのインスタンスを生成する
$accessApp = New-Object -ComObject Access.Application

# Accessのデータベースファイルに接続する
$accessApp.OpenCurrentDatabase($accessDB)

# AccessのテーブルデータをCSVファイルにエクスポートする
$accessApp.DoCmd.TransferText([Microsoft.Office.Interop.Access.AcTextTransferType]::acExportDelim, $Null, $tableName, $csvFile, $True)

# Accessを終了する
$accessApp.Quit()

# COMオブジェクトへの参照を解放する
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($accessApp) | Out-Null

# 変数accessAppを削除し、メモリを解放する
Remove-Variable accessApp

注目すべきコード①

最初に見て頂きたいのは2行目から11行目です。

# フォルダパスを設定する
$folderPath = "C:\work\10_勉強\18_PowerShell\0005\"

# データベースファイル名を設定する
$accessDB = $folderPath + "0005.mdb"

# 取得したデータを出力するCSVファイル名を設定する
$csvFile = $folderPath + "data.csv"

# エクスポートするデータのテーブル名を設定する
$tableName = "t_item"

コードの説明

以上のコードは、AccessのデータベースファイルのフルパスとCSVファイル名、そしてエクスポートするデータのテーブル名を設定するコードです。

注目すべきコード②

次に見て頂きたいのは14行目から17行目です。

# Accessデータベースに接続して操作を行うためのAccessアプリケーションのインスタンスを生成する
$accessApp = New-Object -ComObject Access.Application

# Accessのデータベースファイルに接続する
$accessApp.OpenCurrentDatabase($accessDB)

# AccessのテーブルデータをCSVファイルにエクスポートする
$accessApp.DoCmd.TransferText([Microsoft.Office.Interop.Access.AcTextTransferType]::acExportDelim, $Null, $tableName, $csvFile, $True)

コードの説明

以上のコードは、Accessデータベースに接続して操作を行うためのAccessアプリケーションのインスタンスを生成したら、Accessのデータベースファイルに接続してエクスポート処理を行うコードです。

ではエクスポートするのにはどうするのか?というと、PowerShellが直接Accessのメソッドを実行する、という方法を使います。

そのためには、まずはAccessのインスタンスを生成します。(14行目)

「Access.Application」はAccessのアプリケーションを指し、New-Objectコマンドレットの引数に指定して実行することでAccessのインスタンスが生成されます。

Accessのインスタンスを生成することで、PowerShellがAccessのデータベースへの接続ができるようになります。

また、Accessのメソッドも実行することができるようになります。

なお、Accessのアプリケーションをインスタンスとして扱うには、「-ComObject」オプションが必要です。

Accessのデータベースの接続はOpenCurrentDatabaseメソッドにAccessのデータベースファイルを引数に指定して実行します。(17行目)

Accessのデータベースに接続したら、エクスポート処理を行うためのTransferTextメソッドを実行します。(20行目)

TransferTextメソッドの引数は下のとおりです。

第1引数:TransferType

第1引数のTransferTypeは、エクスポートするCSVファイルの形式を指定する引数の項目です。

区切り文字で区切られたデータをCSVファイルにエクスポートしたいので、acExportDelimを指定しています。(acExportDelimは区切り文字で区切られたテキストファイルをエクスポートするための定数)

なお[Microsoft.Office.Interop.Access.AcTextTransferType]は何かというと、型です。

つまりacExportDelimは、Microsoft.Office.Interop.Access.AcTextTransferTypeという列挙型の定数です。

ちなみに、acExportDelimの値は2です。

第2引数:SpecificationName

第2引数のSpecificationNameには、インポートまたはエクスポートの定義名を指定します。

今回は何か定義したものを使うわけではないので$null(何も無し)を指定しています。

第3引数:TableName

第3引数のTableNameにはデータのエクスポートするテーブル名を指定します。

第4引数:FileName

第4引数のFileNameにはCSVファイルのフルパスを指定します。

第5引数:HasFieldNames

第5引数のHasFieldNamesは、エクスポートするCSVファイルの最初の行がフィールド名を含むかどうかを設定します。

今回はヘッダをCSVファイルに出力したいのでTrueを指定しています。

注目すべきコード③

次に見て頂きたいのは23行目から32行目です。

# Accessのデータベースファイルの接続を閉じる
$accessApp.CloseCurrentDatabase()

# Accessを終了する
$accessApp.Quit()

# COMオブジェクトへの参照を解放する
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($accessApp) | Out-Null

# 変数accessAppを削除し、メモリを解放する
Remove-Variable accessApp

コードの説明

以上のコードは、Accessのデータベースファイルの接続を閉じてAccessを終了させ、そしてCOMオブジェクトへの参照を解放(Accessのプロセスの終了)する処理のコードです。

コードの詳細

23行目のコードでは、CloseCurrentDatabaseメソッドを実行してAccessのデータベースファイルの接続を閉じます。

26行目のコードでは、Accessを終了させます。

29行目のコードでは、COMオブジェクトへの参照を解放(Accessのプロセスの終了)します。

ReleaseComObjectメソッドの引数にAccessのインスタンスを指定して実行することで、COMオブジェクトへの参照が解放されます。

32行目のコードでは、変数accessAppを削除し、メモリを解放します。

動作確認

Accessのデータベースファイルの例」をご覧ください。

最後に

この記事では、AccessのテーブルデータをCSVファイルにエクスポートする方法についてご説明しました。

PowerShellからAccessのテーブルデータをCSVファイルにエクスポートしたい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら