【PowerShell】MySQLのテーブルにCSVファイルのデータをインポートするには①

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

今回どのようにインポートするのかというと、SQLのINSERT文を使って行います。

【動画】PowershellでMySQLのテーブルにCSVファイルのデータをインポートする実際の動き

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


CSVファイルからデータを読み込み、INSERT文を実行してMySQLのテーブルにインポートしています。

コードの流れ

STEP.1
接続文字列を設定する
接続文字列を設定します。
接続先のサーバ名、データベース名、ユーザ名、パスワードをここで指定します。
STEP.2
インポート先のテーブルのフィールド名をすべて取得する
インポート先のテーブルのフィールド名をすべて取得します。
INSERT文を実行するのに、インポート先のテーブルのフィールド名が必要なので取得します。
STEP.3
CSVファイルからデータを読み込む
CSVファイルからデータを読み込みます。
STEP.4
データの件数分INSERT文を繰り返し実行する
データの件数分INSERT文を繰り返し実行します。
STEP.5
MySQLとの接続を閉じる
MySQLとの接続を閉じます。

CSVファイルとMySQLのデータベース・テーブルの例

CSVファイル

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

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

MySQLのデータベースとテーブル

今回は下のMySQLのデータベースとテーブルを用意しました。

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

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

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

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

PowerShellのコード(例)

# PowerShellからMySQLを操作するための「MySql.Data.dll」のフルパスを取得する
$diiPath = "C:\Program Files (x86)\MySQL\MySQL Installer for Windows\MySql.Data.dll"

# 「MySql.Data.dll」を読み込む
[System.Reflection.Assembly]::LoadFile($diiPath) | Out-Null

$server = "localhost"           # 接続するサーバ名
$database = "testdb"            # 接続するデータベース名
$user = "root"                  # ログインユーザ名
$password = "testPass@123456"   # ログインユーザのパスワード

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

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

# インポート先のテーブル名
$tableName = "syain"

# 接続文字列を設定する
$connectionString = "Server=$server;Database=$database;Uid=$user;Pwd=$password;"

# MySqlConnectionオブジェクトを生成する
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)

# データベースに接続する
$connection.Open()

# コマンドオブジェクトを生成する
$command = $connection.CreateCommand()

# インポート先のテーブルのフィールド名を取得するSELECT文を用意する
$command.CommandText = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS " +
                        "WHERE TABLE_SCHEMA = '$database' " +
                        "AND TABLE_NAME = '$tableName'"

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

# 空の配列を用意する
$columnNames = @()

# 取得したデータの最終行まで処理を繰り返すwhileループ
while ($reader.Read()) {

    # readerの値をcolumnNamesに格納する
    $columnNames += $reader['COLUMN_NAME']
}

# readerを閉じる
$reader.Close()

# CSVファイルからデータを読み込む
$csvData = Import-Csv -Path $csvFileName

# 取得したCSVデータの最終行まで処理を繰り返すforeachループ
foreach ($row in $csvData) {

    # フィールド名に対する値を繰り返してすべて取得し、その値を「'」(カンマ)で囲ってinsertValuesに格納する
    $insertValues = $columnNames | ForEach-Object { "'$($row.$_)'"}

    # columnNamesの値を「,」カンマ区切りで連結しinsertColumnStringに格納する
    $insertColumnString = $columnNames -join ", "

    # insertValuesの値を「,」カンマ区切りで連結しinsertValueStringに格納する
    $insertValueString = $insertValues -join ", "

    # insertColumnString(フィールド名)とinsertValues(追加する値)をINSERT文に指定し、そのINSERT文をinsertQueryに格納する
    $insertQuery = "INSERT INTO $tableName ($insertColumnString) VALUES ($insertValueString)"

    # INSERT文をCommandTextプロパティに設定する
    $command.CommandText = $insertQuery

    # INSERT文を実行する
    $command.ExecuteNonQuery() | Out-Null
}

# MySQLとの接続を閉じる
$connection.Close()

注目すべきコード①

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

# PowerShellからMySQLを操作するための「MySql.Data.dll」のフルパスを取得する
$diiPath = "C:\Program Files (x86)\MySQL\MySQL Installer for Windows\MySql.Data.dll"

# 「MySql.Data.dll」を読み込む
[System.Reflection.Assembly]::LoadFile($diiPath) | Out-Null

コードの説明

以上のコードは、PowerShellからMySQLを操作するための「MySql.Data.dll」を読み込むコードです。

「MySql.Data.dll」はPowerShellからMySQLを操作するのに必要なファイルで、PowerShellからMySQLへの接続やSQLクエリの実行などが可能になります。

「MySql.Data.dll」を読み込まないとMySQLへの操作ができないので、「MySql.Data.dll」の読み込みを忘れないようにしましょう。

「MySql.Data.dll」の読み込みはLoadFileメソッドの引数に「MySql.Data.dll」のフルパスを指定して実行します。

ちなみに、私のPCの環境では「C:\Program Files (x86)\MySQL\MySQL Installer for Windows」配下にある「MySql.Data.dll」を参照しています。

注目すべきコード②

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

# MySQLの接続情報を設定する
$server = "localhost"           # 接続するサーバ名
$database = "testdb"            # 接続するデータベース名
$user = "root"                  # ログインユーザ名
$password = "testPass@123456"   # ログインユーザのパスワード

コードの説明

以上のコードは、MySQLの接続情報を設定するコードです。

今回はMySQL接続で接続するので、接続先のサーバ名、データベース名、ユーザ名、パスワードをここで指定します。

【参考】MySQLへの接続情報

注目すべきコード③

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

# インポート先のテーブル名
$tableName = "syain"

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

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

コードの説明

以上のコードは、MySQLのインポート先のテーブル名とCSVファイルのフルパスを設定するコードです。

注目すべきコード④

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

# 接続文字列を設定する
$connectionString = "Server=$server;Database=$database;Uid=$user;Pwd=$password;"

# MySqlConnectionオブジェクトを生成する
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)

コードの説明

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

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

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

注目すべきコード⑤

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

# MySQLに接続する
$connection.Open()

コードの説明

以上のコードは、PowerShellがデータベースに接続する処理のコードです。

注目すべきコード⑥

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

# コマンドオブジェクトを生成する
$command = $connection.CreateCommand()

# インポート先のテーブルのフィールド名を取得するSELECT文を用意する
$command.CommandText = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS " +
                        "WHERE TABLE_SCHEMA = '$database' " +
                        "AND TABLE_NAME = '$tableName'"

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

コードの説明

以上のコードは、コマンドオブジェクトを生成してインポート先のテーブルのフィールド名を取得するSELECT文を用意し、SELECT文を実行します。

コードの詳細

32行目のコードは、SELECT文を実行するためのコマンドオブジェクトを生成します。

35行目から37行目のコードでは、テーブルのフィールド名を取得するためのSELECT文を用意します。

TABLE_SCHEMAにデータベース名、TABLE_NAMEにはテーブル名を指定します。

SELECT文を実行した結果は下のとおりです。

「syain」のすべてのフィールド名が取得されました。

40行目のコードでは、SELECT文を実行します。

注目すべきコード⑦

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

# 空の配列を用意する
$columnNames = @()

コードの説明

以上のコードは、実行したSELECT文が抽出したフィールド名を格納する配列を用意するコードです。

フィールド名を格納しておく「箱」をここで用意しておきます。

注目すべきコード⑧

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

# 取得したデータの最終行まで処理を繰り返すwhileループ
while ($reader.Read()) {

    # readerの値をcolumnNamesに格納する
    $columnNames += $reader['COLUMN_NAME']
}

# readerを閉じる
$reader.Close()

コードの説明

以上のコードは、readerに格納されているフィールド名をcolumnNamesに格納する処理のコードです。

フィールド名をcolumnNamesに格納し終わったらreaderを閉じます。

コードの詳細

46行目のコードは取得したデータの最終行まで処理を繰り返すwhileループです。

49行目のコードでは、readerに格納されているフィールド名をcolumnNamesに格納します。

53行目のコードでは、readerを閉じます。

注目すべきコード⑨

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

# CSVファイルからデータを読み込む
$csvData = Import-Csv -Path $csvFileName

コードの説明

以上のコードは、CSVファイルからデータを読み込む処理のコードです。

Import-CsvのコマンドレットにCSVファイルのフルパスを指定して実行すると、CSVファイルからデータが取得されてcsvDataに格納されます。

注目すべきコード⑩

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

# 取得したCSVデータの最終行まで処理を繰り返すforeachループ
foreach ($row in $csvData) {

コードの説明

以上のコードは、取得したCSVデータの最終行まで処理を繰り返すforeachループです。

注目すべきコード⑪

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

    # フィールド名に対する値を繰り返してすべて取得し、その値を「'」(カンマ)で囲ってinsertValuesに格納する
    $insertValues = $columnNames | ForEach-Object { "'$($row.$_)'"}

    # columnNamesの値を「,」カンマ区切りで連結しinsertColumnStringに格納する
    $insertColumnString = $columnNames -join ", "

    # insertValuesの値を「,」カンマ区切りで連結しinsertValueStringに格納する
    $insertValueString = $insertValues -join ", "

    # insertColumnString(フィールド名)とinsertValues(追加する値)をINSERT文に指定し、そのINSERT文をinsertQueryに格納する
    $insertQuery = "INSERT INTO $tableName ($insertColumnString) VALUES ($insertValueString)"

    # INSERT文をCommandTextプロパティに設定する
    $command.CommandText = $insertQuery

    # INSERT文を実行する
    $command.ExecuteNonQuery() | Out-Null

コードの説明

以上のコードは、取得したデータをINSERT文用に加工してINSERT文を実行する処理のコードです。

コードの詳細

61行目のコードでは、フィールド名に対応するCSVファイルの値を繰り返してすべて取得し、その値を「’」(カンマ)で囲ってinsertValuesに格納しています。

ForEach-ObjectはcolumnNamesの数だけ処理を繰り返すループ文で、今回はフィールドの数が4つなので4回ループしてフィールドに対応する値を取得します。

64行目のコードでは、columnNamesの値を「,」カンマ区切りで連結しinsertColumnStringに格納しています。

INSERT文のフィールド名の指定では、フィールド名をカンマ区切りで指定するので、「-join」演算子を使ってcolumnNamesの値を「,」カンマ区切りで連結します。

67行目のコードでは、insertValuesの値を「,」カンマ区切りで連結しinsertValueStringに格納しています。

INSERT文の値の指定では、追加したい値をカンマ区切りで指定するので、「-join」演算子を使ってinsertValuesの値を「,」カンマ区切りで連結します。

70行目のコードでは、insertColumnString(フィールド名)とinsertValues(追加する値)をINSERT文に指定し、そのINSERT文をinsertQueryに格納しています。

以上のコードで生成されたINSERT文は下のとおりです。

73行目ではCommandTextプロパティにINSERT文を設定し、77行目のExecuteNonQueryメソッドでINSERT文を実行します。

注目すべきコード⑫

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

# MySQLとの接続を閉じる
$connection.Close()

コードの説明

以上のコードは、MySQLとの接続を閉じる処理のコードです。

動作確認

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

最後に

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

PowershellでMySQLのテーブルにCSVファイルのデータをインポートしたい場合は本記事を参考にして頂けたら幸いです。

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

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

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

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