【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オブジェクトへの参照を解放します。

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

CSVファイル

今回は下のCSVファイルを用意しました。

データが10件存在しています。

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

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

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

このテーブルに、先ほどのCSVファイルのデータをインポートします。

インポートした結果は下のとおりです。

CSVファイルのデータが追加されています。

PowerShellのコード(例)

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

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

# インポート元のCSVファイルを設定する
$csvFile = $folderPath + "0004.csv"

# インポート先のテーブル名を設定する
$tableName = "t_item"

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

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

# CSVファイルのデータをインポートする
$conn.DoCmd.TransferText([Microsoft.Office.Interop.Access.AcTextTransferType]::acImportDelim, $null, $tableName, $csvFile, $True)

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

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

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

注目すべきコード①

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

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

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

# インポート元のCSVファイルを設定する
$csvFile = $folderPath + "0004.csv"

コードの説明

以上のコードは、AccessのデータベースファイルのフルパスおよびCSVファイル名を設定するコードです。

注目すべきコード②

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

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

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

# CSVファイルのデータをインポートする
$conn.DoCmd.TransferText([Microsoft.Office.Interop.Access.AcTextTransferType]::acImportDelim, $null, $tableName, $csvFile, $True)

コードの説明

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

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

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

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

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

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

なお、COMオブジェクト(Access)をインスタンスとして扱うには、「-ComObject」オプションが必要です。

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

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

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

第1引数:TransferType

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

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

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

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

ちなみに、acImportDelimの値は0です。

第2引数:SpecificationName

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

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

第3引数:TableName

第3引数のTableNameにはデータのインポート先のテーブル名を指定します。

第4引数:FileName

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

第5引数:HasFieldNames

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

今回はCSVファイルのデータには1行目にフィールド名があるのでTrueを指定しています。

注目すべきコード③

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

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

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

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

コードの説明

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

コードの詳細

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

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

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

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

動作確認

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

最後に

この記事では、PowerShellからAccessのテーブルデータを取得してCSVファイルに保存する方法についてご説明しました。

PowerShellからAccessのテーブルデータを取得してCSVファイルに保存したい場合は本記事を参考にして頂けたら幸いです。

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

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

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

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