====== CSVをSQLiteのテーブルにインポートする ======
[[:powershell|一つ上へ]]
===== 例1 =====
# CSVやTSVのデータをSQLiteでデータベースにインポートする
# CSVを読み込み
#$data = Import-Csv -Path .\list.tsv -Delimiter "`t" # タブ区切り
#$data = Import-Csv -Path .\list.csv -Delimiter ";" # セミコロン区切り
$data = Import-Csv -Path .\list.csv
$data | Format-Table
# sqlite3.dll を読み込む
Add-Type -Path ".\System.Data.SQLite.dll"
# DBのファイルパス(無ければ新規作成)
$dbFile = ".\test.db"
$connectionString = "Data Source=$dbFile;Version=3;"
if (-not (Test-Path $dbFile)) {
[System.Data.SQLite.SQLiteConnection]::CreateFile($dbFile)
}
# SQLite 接続オブジェクトを作成
$conn = New-Object System.Data.SQLite.SQLiteConnection($connectionString)
$conn.Open()
# コマンドオブジェクト
$cmd = $conn.CreateCommand()
# テーブルがない場合は作成
$cmd.CommandText = @"
CREATE TABLE IF NOT EXISTS logs (
date TEXT NOT NULL,
level TEXT,
detail TEXT
);
"@
$cmd.ExecuteNonQuery()
foreach ($row in $data) {
$cmd = $conn.CreateCommand()
$cmd.CommandText = "INSERT INTO logs (date, level, detail) VALUES (@date, @level, @detail)"
$cmd.Parameters.AddWithValue("@date", $row.date) | Out-Null
$cmd.Parameters.AddWithValue("@level", $row.level) | Out-Null
$cmd.Parameters.AddWithValue("@detail", $row.detail) | Out-Null
$cmd.ExecuteNonQuery()
}
$conn.Close()
===== 例2 =====
トランザクションを使うことによって、書き込み処理をまとめて実行することができるため処理を高速化できる。
**$conn.BeginTransaction()**でトランザクションを開始し、**Comit()**で処理を確定する。
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# sqlite3.dll を読み込む
Add-Type -Path "path\to\dll\System.Data.SQLite.dll"
# DBのファイルパス(無ければ新規作成)
$dbFile = "path\to\database\database.db"
$connStr = "Data Source=$dbFile;Version=3;"
# SQLite 接続オブジェクトを作成
$conn = New-Object System.Data.SQLite.SQLiteConnection($connStr)
$conn.Open()
# CSVデータの読み込み
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.Filter = "CSVファイル(*.csv)|*.csv|All files (*.*)|*.*"
$dialog_result = $dialog.ShowDialog()
if ($dialog_result -eq [System.Windows.Forms.DialogResult]::OK) {
$csvPath = $dialog.FileName
$csvData = Import-Csv -Path $csvPath
# 処理の高速化のためのトランザクション開始
$tran = $conn.BeginTransaction()
$cmd = $conn.CreateCommand()
$cmd.Transaction = $tran
$cmd.CommandText = "INSERT INTO table_name (date, col1, col2) VALUES (@date, @col1, @col2);"
# パラメータを一度だけ作成する
$null = $cmd.Parameters.Add("@date", [System.Data.DbType]::String)
$null = $cmd.Parameters.Add("@col1", [System.Data.DbType]::String)
$null = $cmd.Parameters.Add("@col2", [System.Data.DbType]::String)
foreach ($row in $csvData) {
$cmd.Parameters["@date"].Value = $row.'date'
$cmd.Parameters["@col1"].Value = $row.'col1'
$cmd.Parameters["@col2"].Value = $row.'col2'
$cmd.ExecuteNonQuery() | Out-Null
}
# トランザクションをコミットする
$tran.Commit()
} else {
[System.Windows.Forms.MessageBox]::Show("処理を中止しました。")
}
$conn.Close()