この記事では、PowershellからSQLiteのテーブルデータをCSVファイルにエクスポートする方法についてご説明します。
【動画】PowershellからSQLiteのテーブルデータをCSVファイルにエクスポートする実際の動き
本題に入る前に、まずは次の動画をご覧ください。
PowershellからSQLiteのデータベースに接続してデータを取得し、そのデータをCSVファイルにエクスポートしています。
コードの流れ
「System.Data.SQLite.dll」を読み込むことで、PowerShellからSQLiteへの接続やSQLクエリの実行などが可能になります。
「System.Data.SQLite.dll」がないとPowerShellからSQLiteへの接続やSQLクエリの実行などができないので、「System.Data.SQLite.dll」を読み込みます。
SQLiteのデータベースとテーブルの例
今回は下のSQLiteのデータベースとテーブルを用意しました。
SQLiteのデータベースに「syain」のテーブルが存在しています。
今回はこの「syain」テーブルのデータをCSVファイルにエクスポートします。
エクスポートしたCSVファイルは下のとおりです。
「syain」のテーブルデータがCSVファイルに出力されています。
PowerShellのコード(例)
# フォルダパスを設定する $folderPath = "C:\work\10_勉強\18_PowerShell\0025\" # PowerShellからSQLiteを操作するための「System.Data.SQLite.dll」のフルパスを取得する $dllPath = ($folderPath, "System.Data.SQLite.dll" -join '') # 「System.Data.SQLite.dll」を読み込む [System.Reflection.Assembly]::LoadFile($dllPath) | Out-Null # SQLiteの接続情報を設定する $databasePath = ($folderPath, "0025_DB01.db" -join '') # 取得したデータを出力するCSVファイル名を設定する $csvFileName = $folderPath + "data.csv" # エクスポートするデータのテーブル名を設定する $tableName = "syain" # 接続文字列を設定する(SQLiteの場合) $connectionString = "Data Source=$databasePath;Version=3;" # SQLiteConnectionオブジェクトを生成する $conn = New-Object System.Data.SQLite.SQLiteConnection($connectionString) # SELECT文を設定する $query = "SELECT * FROM $tableName" # SQLiteCommandオブジェクトを生成する $cmd = New-Object System.Data.SQLite.SQLiteCommand($query, $conn) # SQLiteに接続する $conn.Open() # SELECT文を実行し、結果をSQLiteDataReaderに格納する $reader = $cmd.ExecuteReader() # DataTableオブジェクトのインスタンスを生成する $dt = New-Object System.Data.DataTable # SQLiteDataReaderの内容を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($csvFileName, $csvData, $utf8) # データベース接続を閉じる $conn.Close()
注目すべきコード①
最初に見て頂きたいのは2行目から8行目です。
# フォルダパスを設定する $folderPath = "C:\work\10_勉強\18_PowerShell\0025\" # PowerShellからSQLiteを操作するための「System.Data.SQLite.dll」のフルパスを取得する $dllPath = ($folderPath, "System.Data.SQLite.dll" -join '') # 「System.Data.SQLite.dll」を読み込む [System.Reflection.Assembly]::LoadFile($dllPath) | Out-Null
コードの説明
以上のコードは、PowerShellからSQLiteを操作するための「System.Data.SQLite.dll」を読み込むコードです。
今回はSQLiteのデータベースファイルに接続するので「System.Data.SQLite.dll」を読み込みます。
「System.Data.SQLite.dll」を読み込むことで、データベースにアクセスするために必要なクラスやメソッドを使用することができるようになります。
注目すべきコード②
次に見て頂きたいのは11行目です。
# SQLiteの接続情報を設定する $databasePath = ($folderPath, "0025_DB01.db" -join '')
コードの説明
以上のコードは、SQLiteのデータベースファイルのフルパスを取得するコードです。
注目すべきコード③
次に見て頂きたいのは11行目です。
# 取得したデータを出力するCSVファイル名を設定する $csvFileName = $folderPath + "data.csv"
コードの説明
以上のコードは、取得したデータを出力するCSVファイル名を設定するコードです。
注目すべきコード④
次に見て頂きたいのは217行目から23行目です。
# エクスポートするデータのテーブル名を設定する $tableName = "syain" # 接続文字列を設定する(SQLiteの場合) $connectionString = "Data Source=$databasePath;Version=3;" # SQLiteConnectionオブジェクトを生成する $conn = New-Object System.Data.SQLite.SQLiteConnection($connectionString)
コードの説明
以上のコードは、インポート先のテーブル名の設定、および接続文字列を作成してSQLiteConnectionオブジェクトを生成するコードです。
今回CSVファイルのデータをインポートするテーブル名は「syain」です。
また、SQLiteのデータベースに接続するための接続情報をSQLiteConnectionオブジェクトに格納します。
このコードにより、どのSQLiteのデータベースに接続するのか、PowerShellが認識できるようになります。
注目すべきコード⑤
次に見て頂きたいのは29行目から32行目です。
# SELECT文を設定する $query = "SELECT * FROM $tableName" # SQLiteCommandオブジェクトを生成する $cmd = New-Object System.Data.SQLite.SQLiteCommand($query, $conn)
コードの説明
以上のコードは、SELECT文を取得し、そのSELECT文をSQLiteCommandメソッドに渡してSQLiteCommandオブジェクトを生成するコードです。
SQLiteCommandオブジェクトを生成することで、SELECT文を実行することができるようになります。
注目すべきコード⑥
次に見て頂きたいのは32行目から35行目です。
# SQLiteに接続する $conn.Open() # SELECT文を実行し、結果をSqlDataReaderに格納する $reader = $cmd.ExecuteReader()
コードの説明
以上のコードは、PowerShellがSQLiteに接続してSELECT文を実行する処理のコードです。
SELECT文を実行して取得したデータは、readerに格納されます。
注目すべきコード⑦
次に見て頂きたいのは38行目から41行目です。
# DataTableオブジェクトのインスタンスを生成する $dt = New-Object System.Data.DataTable # SqlDataReaderの内容をDataTableにロードする $dt.Load($reader)
コードの説明
以上のコードは、DataTableオブジェクトのインスタンスを生成し、readerの値をデータテーブルにロードする処理のコードです。
注目すべきコード⑧
次に見て頂きたいのは44行目です。
# DataTableの内容をCSV形式の文字列に変換する $csvData = $dt | ConvertTo-Csv -NoTypeInformation -Delimiter ","
コードの説明
以上のコードは、データテーブルのデータを、CSV形式の文字列に変換する処理のコードです。
CSV形式の文字列に変換するにはConvertTo-Csvコマンドレットを使います。
今回はデータをカンマ区切りにしたいので、「Delimiter」パラメータに「,」(カンマ)を指定しています。
また、ConvertTo-Csvコマンドレットが生成する型情報の行は不要なので「NoTypeInformation」パラメータを指定して型情報の行を除外します。
注目すべきコード⑨
次に見て頂きたいのは47行目から50行目です。
# UTF-8エンコーディングのインスタンスを生成する $utf8 = New-Object System.Text.UTF8Encoding $false # CSVデータをUTF-8形式でファイルに書き出す [System.IO.File]::WriteAllLines($csvFileName, $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つを指定します。
注目すべきコード⑩
次に見て頂きたいのは53行目です。
# データベース接続を閉じる $conn.Close()
以上のコードは、PowerShellがAccessのデータベースファイルとの接続を閉じる処理のコードです。
動作確認
「SQLiteのデータベースとテーブルの例」をご覧ください。
最後に
この記事では、PowershellからSQLiteのテーブルデータをCSVファイルにエクスポートする方法についてご説明しました。
PowershellからSQLiteのテーブルデータをCSVファイルにエクスポートしたい場合は本記事を参考にして頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。