この記事では、PowerShellからSQLiteのテーブルデータを取得してCSVファイルに保存する方法についてご説明します。
【動画】PowerShellからSQLiteのテーブルデータを取得してCSVファイルに保存する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
接続文字列を設定し、PowerShellからSQLiteのデータベースに接続します。
接続したら、取得先のテーブルに対してSELECT文を実行してテーブルデータを取得しています。
今回は取得したデータをCSVファイルに保存しています。
コードの流れ
「System.Data.SQLite.dll」を読み込むことで、PowerShellからSQLiteへの接続やSQLクエリの実行などが可能になります。
「System.Data.SQLite.dll」がないとPowerShellからSQLiteへの接続やSQLクエリの実行などができないので、「System.Data.SQLite.dll」を読み込みます。
SQLiteのデータベースとテーブルの例
今回は下のSQLiteのデータベースとテーブルを用意しました。
SQLiteのデータベースには「syain」のテーブルが存在しており、10件のデータが存在しています。
今回はこの10件のデータをCSVファイルに保存します。
生成したCSVファイルの中身は下のとおりです。
PowerShellのコード(例)
# フォルダパスを設定する $folderPath = "C:\work\10_勉強\18_PowerShell\0021\" # PowerShellからSQLiteを操作するための「System.Data.SQLite.dll」を読み込む Add-Type -Path ($folderPath, "System.Data.SQLite.dll" -join '') # SQLiteのデータベースファイルのフルパスを設定する $databasePath = ($folderPath, "0021_DB01.db" -join '') # 取得したデータを出力するCSVファイル名を設定する $csvFileName = $folderPath + "data.csv" # 接続文字列を設定する $connectionString = "Data Source=$databasePath;Version=3;" # SQLiteConnectionオブジェクトを生成する $connection = New-Object System.Data.SQLite.SQLiteConnection($connectionString) # SELECT文を設定する $query = "SELECT * FROM syain" # SQLiteCommandオブジェクトを生成する $command = New-Object System.Data.SQLite.SQLiteCommand($query, $connection) # データベースに接続する $connection.Open() # SELECT文を実行する $reader = $command.ExecuteReader() # 空の配列を用意する $table = @() # テーブルのフィールド名をすべて取得する $columnNames = $reader.GetSchemaTable() | Select -Expand ColumnName # 取得したデータの最終行まで処理を繰り返すwhileループ while ($reader.Read()) { # 1行分のデータを格納するPSObjectインスタンスを生成し、rowに格納する $row = New-Object PSObject # フィールドの数だけ処理を繰り返すforeachループ foreach ($columnName in $columnNames) { # rowに行のデータを格納する $row | Add-Member -MemberType NoteProperty -Name $columnName -Value $reader[$columnName] } # tableにrowの値を追加で格納する $table += $row } # 表形式でtableの値を出力する $table | Format-Table -AutoSize | Out-File $csvFileName # データベースとの接続を閉じる $connection.Close()
注目すべきコード①
最初に見て頂きたいのは2行目から5行目です。
# フォルダパスを設定する $folderPath = "C:\work\10_勉強\18_PowerShell\0021\" # PowerShellからSQLiteを操作するための「System.Data.SQLite.dll」を読み込む Add-Type -Path ($folderPath, "System.Data.SQLite.dll" -join '')
コードの説明
以上のコードは、PowerShellからSQLiteを操作するための「System.Data.SQLite.dll」を読み込むコードです。
今回はSQLiteのデータベースファイルに接続するので「System.Data.SQLite.dll」を読み込みます。
「System.Data.SQLite.dll」を読み込むことで、データベースにアクセスするために必要なクラスやメソッドを使用することができるようになります。
注目すべきコード②
次に見て頂きたいのは8行目です。
# SQLiteのデータベースファイルのフルパスを設定する $databasePath = ($folderPath, "0020_DB01.db" -join '')
コードの説明
以上のコードは、SQLiteのデータベースファイルのフルパスを取得するコードです。
注目すべきコード③
次に見て頂きたいのは11行目から14行目です。
# 取得したデータを出力するCSVファイル名を設定する $csvFileName = $folderPath + "data.csv"
コードの説明
以上のコードは、取得したデータを出力するCSVファイル名を設定するコードです。
注目すべきコード③
次に見て頂きたいのは14行目から17行目です。
# 接続文字列を設定する $connectionString = "Data Source=$databasePath;Version=3;" # SQLiteConnectionオブジェクトを生成する $connection = New-Object System.Data.SQLite.SQLiteConnection($connectionString)
コードの説明
以上のコードは、接続文字列を作成してSQLiteConnectionオブジェクトを生成するコードです。
SQLiteのデータベースに接続するための接続情報をSQLiteConnectionオブジェクトに格納します。
このコードにより、どのSQLiteのデータベースに接続するのか、PowerShellが認識できるようになります。
注目すべきコード④
次に見て頂きたいのは20行目から23行目です。
# SELECT文を設定する $query = "SELECT * FROM syain" # SQLiteCommandオブジェクトを生成する $command = New-Object System.Data.SQLite.SQLiteCommand($query, $connection)
コードの説明
以上のコードは、SELECT文を取得し、そのSELECT文をSQLiteCommandメソッドに渡してSQLiteCommandオブジェクトを生成するコードです。
SQLiteCommandオブジェクトを生成することで、SELECT文を実行することができるようになります。
注目すべきコード⑤
次に見て頂きたいのは26行目です。
# データベースに接続する $connection.Open()
コードの説明
以上のコードは、PowerShellがデータベースに接続する処理のコードです。
注目すべきコード⑥
次に見て頂きたいのは29行目です。
# SELECT文を実行する $reader = $command.ExecuteReader()
コードの説明
以上のコードは、SELECT文を実行する処理のコードです。
実行したSELECT文が抽出したデータはreaderに格納されます。
注目すべきコード⑦
次に見て頂きたいのは32行目です。
# 空の配列を用意する $table = @()
コードの説明
以上のコードは、実行したSELECT文が抽出したデータを格納する配列を用意するコードです。
コンソールに出力する情報をすべて格納しておく「箱」をここで用意しておきます。
注目すべきコード⑧
次に見て頂きたいのは35行目です。
# テーブルのフィールド名をすべて取得する $columnNames = $reader.GetSchemaTable() | Select -Expand ColumnName
コードの説明
以上のコードは、テーブルのフィールド名をすべて取得するコードです。
今回は「syain」のテーブルに対してSELECT文を実行しているので、「syain」テーブルにあるフィールド名をすべて取得し、columnNamesに格納しています。
「syain」テーブルのフィールド名は「id」「name」「address」「age」の4つのフィールドがあるので、この4つ全てのフィールド名がcolumnNamesに格納されます。
注目すべきコード⑨
次に見て頂きたいのは41行目です。
# 取得したデータの最終行まで処理を繰り返すwhileループ while ($reader.Read()) {
コードの説明
以上のコードは、取得したデータの最終行まで処理を繰り返すwhile文です。
今回は10件あるテーブルデータを取得しているので10件目まで処理を繰り返します。
注目すべきコード⑩
次に見て頂きたいのは41行目から51行目です。
# 1行分のデータを格納するPSObjectインスタンスを生成し、rowに格納する $row = New-Object PSObject # フィールドの数だけ処理を繰り返すforeachループ foreach ($columnName in $columnNames) { # rowに行のデータを格納する $row | Add-Member -MemberType NoteProperty -Name $columnName -Value $reader[$columnName] } # tableにrowの値を追加で格納する $table += $row
コードの説明
以上のコードは、取得したテーブルデータをtableに格納する処理のコードです。
取得したテーブルデータを1行ずつ取得し、tableに格納していきます。
コードの詳細
41行目のコードは、新しいPowerShellオブジェクトのPSObjectを生成し、rowという変数に格納します。
44行目のコードは、フィールドの数だけ処理を繰り返すforeachです。
「syain」テーブルのフィールドは「id」「name」「address」「age」の4つなので、4回処理を繰り返します。
47行目のコードでは、rowに行のデータを格納しています。
rowへの追加はAdd-Memberコマンドレットを実行します。
Add-Memberコマンドレットに「-MemberType NoteProperty」パラメータを指定することで、追加するメンバー(プロパティやメソッドなど)の種類を指定します。
「-MemberType NoteProperty」パラメータは値を格納するために指定します。
「-Name」パラメータにcolumnNameを指定し、「-Value」パラメータに$reader[$columnName]を指定します。
columnNameには現在のフィールド名が、$reader[$columnName]には現在の列の値が格納されています。
各行のデータが一つのPSObject(PowerShellオブジェクト)としてまとまり、そのプロパティとして各列のデータが格納されます。
51行目のコードは、tableにrowの値を追加で格納します。
注目すべきコード⑪
次に見て頂きたいのは55行目です。
# 表形式でtableの値を出力する $table | Format-Table -AutoSize | Out-File $csvFileName
コードの説明
以上のコードは、表形式でtableの値をCSVファイルに保存するコードです。
Out-Fileコマンドレットを使うことで、このコマンドをCSVファイルに保存することができます。
Out-Fileコマンドレットの後にCSVファイルのフルパスを指定することで、そのCSVファイルにtableの値が保存されます。
保存されたCSVファイルは下のとおりです。
CSVファイルには出力せず、「$table | Format-Table -AutoSize」のコマンドをコンソール上で実行した結果は以下のとおりです。
注目すべきコード⑫
次に見て頂きたいのは58行目です。
# データベースとの接続を閉じる $connection.Close()
コードの説明
以上のコードは、データベースとの接続を閉じる処理のコードです。
動作確認
「SQLiteのデータベースとテーブルの例」をご覧ください。
最後に
この記事では、PowerShellからSQLiteのテーブルデータを取得してCSVファイルに保存する方法についてご説明しました。
PowerShellからSQLiteのテーブルデータを取得してCSVファイルに保存したい場合は本記事を参考にして頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。