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

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

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

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


PowershellからAccessのデータベースに接続してデータを取得し、そのデータをCSVファイルにエクスポートしています。

コードの流れ

STEP.1
Accessのデータベースに接続するための接続文字列を設定する
Accessのデータベースに接続するための接続文字列を設定します。
STEP.2
SELECT文を設定する
SELECT文を設定します。
STEP.3
OleDbConnectionオブジェクトとOleDbCommandオブジェクトを生成する
OleDbConnectionオブジェクトとOleDbCommandオブジェクトを生成します。
STEP.4
Accessのデータベースファイルに接続する
Accessのデータベースファイルに接続します。
STEP.5
エクスポートするデータを取得するSELECT文を実行する
エクスポートするデータを取得するSELECT文を実行します。
STEP.6
取得したデータをデータテーブルに格納する
取得したデータをデータテーブルに格納します。
STEP.7
データテーブルに格納されているデータをCSV形式の文字列に変換する
データテーブルに格納されているデータをCSV形式の文字列に変換します。
STEP.8
データテーブルのデータをCSVファイルに書き出す
データテーブルのデータをCSVファイルに書き出します。
STEP.9
Accessのデータベースファイルへの接続を閉じる
Accessのデータベースファイルへの接続を閉じます。

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

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

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

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

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

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

PowerShellのコード(例)

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

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

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

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

# Accessデータベースへの接続文字列を設定する
$connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$accessDB;Persist Security Info=False;"

# OleDbConnectionオブジェクトを生成する
$conn = New-Object System.Data.OleDb.OleDbConnection($connectionString)

# SELECT文を設定する
$query = "SELECT * FROM [$tableName]"

# OleDbCommandオブジェクトを生成する
$cmd = New-Object System.Data.OleDb.OleDbCommand($query, $conn)

# データベース接続を開く
$conn.Open()

# SELECT文を実行し、結果をOleDbDataReaderに格納する
$reader = $cmd.ExecuteReader()

# DataTableオブジェクトのインスタンスを生成する
$dt = New-Object System.Data.DataTable

# OleDbDataReaderの内容をDataTableにロードする
$dt.Load($reader)

# DataTableの内容をCSV形式の文字列に変換する
$csvData = $dt | ConvertTo-Csv -NoTypeInformation -Delimiter ","

# UTF-8エンコーディングのインスタンスを生成する
$utf8 = New-Object System.Text.UTF8Encoding $false

# CSVデータをUTF-8形式でファイルに書き出す
[System.IO.File]::WriteAllLines($csvFile, $csvData, $utf8)

# データベース接続を閉じる
$conn.Close()

注目すべきコード①

最初に見て頂きたいのは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データベースへの接続文字列を設定する
$connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$accessDB;Persist Security Info=False;"

# OleDbConnectionオブジェクトを生成する
$conn = New-Object System.Data.OleDb.OleDbConnection($connectionString)

コードの説明

以上のコードは、接続文字列を作成してOleDbConnectionオブジェクトを生成するコードです。

Accessのデータベースに接続するための接続情報をconnectionオブジェクトに格納します。

このコードにより、どのAccessのデータベースファイルに接続するのか、PowerShellが認識できるようになります。

接続先のAccessのデータベースファイルは変数accessDBに格納されています。

注目すべきコード③

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

# SELECT文を設定する
$query = "SELECT * FROM [$tableName]"

# OleDbCommandオブジェクトを生成する
$cmd = New-Object System.Data.OleDb.OleDbCommand($query, $conn)

コードの説明

以上のコードは、SELECT文を取得し、そのSELECT文をOleDbCommandメソッドに渡してOleDbCommandオブジェクトを生成するコードです。

OleDbCommandオブジェクトを生成することで、SELECT文を実行することができるようになります。

注目すべきコード④

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

# データベース接続を開く
$conn.Open()

# SELECT文を実行し、結果をOleDbDataReaderに格納する
$reader = $cmd.ExecuteReader()

コードの説明

以上のコードは、PowerShellがAccessのデータベースファイルに接続してSELECT文を実行する処理のコードです。

SELECT文を実行して取得したデータは、readerに格納されます。

注目すべきコード⑤

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

# DataTableオブジェクトのインスタンスを生成する
$dt = New-Object System.Data.DataTable

# OleDbDataReaderの内容をDataTableにロードする
$dt.Load($reader)

コードの説明

以上のコードは、DataTableオブジェクトのインスタンスを生成し、readerの値をデータテーブルにロードする処理のコードです。

注目すべきコード⑥

次に見て頂きたいのは38行目です。

# DataTableの内容をCSV形式の文字列に変換する
$csvData = $dt | ConvertTo-Csv -NoTypeInformation -Delimiter ","

コードの説明

以上のコードは、データテーブルのデータを、CSV形式の文字列に変換する処理のコードです。

CSV形式の文字列に変換するにはConvertTo-Csvコマンドレットを使います。

今回はデータをカンマ区切りにしたいので、「Delimiter」パラメータに「,」(カンマ)を指定しています。

また、ConvertTo-Csvコマンドレットが生成する型情報の行は不要なので「NoTypeInformation」パラメータを指定して型情報の行を除外します。

注目すべきコード⑦

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

# UTF-8エンコーディングのインスタンスを生成する
$utf8 = New-Object System.Text.UTF8Encoding $false

# CSVデータをUTF-8形式でファイルに書き出す
[System.IO.File]::WriteAllLines($csvFile, $csvData, $utf8)

コードの説明

以上のコードは、UTF-8エンコーディングのインスタンスを生成し、UTF-8形式でファイルに書き出す処理のコードです。

CSVファイルへの出力は、今回UTF-8形式で行います。

UTF-8形式で出力するには、まずはUTF-8エンコーディングのインスタンスを生成します。

UTF-8エンコーディングのインスタンスの生成は、New-Objectコマンドレットを使います。

New-Objectコマンドレットの引数に「System.Text.UTF8Encoding」クラスを指定することでUTF-8エンコーディングのインスタンスが生成されます。

また、$falseはBOMを使用しないことを示しています。(今回はBOMは使用しない)

以上でUTF-8エンコーディングのインスタンスが生成できたら、WriteAllLinesメソッドを実行してCSVファイルにデータを出力します。

今回使用するWriteAllLinesメソッドは、.NET FrameworkのSystem.IO.Fileクラスに定義されている静的(またはクラス)メソッドです。

WriteAllLinesメソッドの引数には、出力するCSVファイル、CSVファイルに出力するデータ(今回はテーブルデータ)、そしてエンコーディング(今回は先ほどのUTF-8エンコーディングのインスタンス)の3つを指定します。

注目すべきコード⑧

次に見て頂きたいのは47行目です。

# データベース接続を閉じる
$conn.Close()

コードの説明

以上のコードは、PowerShellがAccessのデータベースファイルとの接続を閉じる処理のコードです。

動作確認

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

最後に

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

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

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

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

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

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