この記事では、AccessのテーブルデータをCSVファイルにエクスポートする方法についてご説明します。
【動画】AccessのテーブルデータをCSVファイルにエクスポートする実際の動き
本題に入る前に、まずは次の動画をご覧ください。
PowershellからAccessのデータベースに接続してデータを取得し、そのデータをCSVファイルにエクスポートしています。
コードの流れ
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週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。