ユーザ用ツール

サイト用ツール


powershell:sqlite_import_csv

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
powershell:sqlite_import_csv [2025/08/26 23:22] mikotopowershell:sqlite_import_csv [2025/10/14 00:49] (現在) mikoto
行 2: 行 2:
 [[:powershell|一つ上へ]] [[:powershell|一つ上へ]]
  
 +===== 例1 =====
 <code powershell> <code powershell>
-SQLite の DLL を読み込み+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" Add-Type -Path ".\System.Data.SQLite.dll"
  
-SQLite データベースのパス +DBファイルパス(無ければ新規作成) 
-$dbPath = ".\test.db" +$dbFile = ".\test.db" 
-$connectionString = "Data Source=$dbPath;Version=3;"+$connectionString = "Data Source=$dbFile;Version=3;"
  
-# 接続を開く +if (-not (Test-Path $dbFile)) { 
-$connection = New-Object System.Data.SQLite.SQLiteConnection($connectionString+    [System.Data.SQLite.SQLiteConnection]::CreateFile($dbFile
-$connection.Open()+}
  
-テー作成(無ければ作る) +SQLite 接続オジェクトを作成 
-$command = $connection.CreateCommand() +$conn = New-Object System.Data.SQLite.SQLiteConnection($connectionString) 
-$command.CommandText = @" +$conn.Open() 
-CREATE TABLE IF NOT EXISTS people + 
-    id   INTEGER PRIMARY KEY+# コマンドオブジェクト 
-    name TEXT, +$cmd = $conn.CreateCommand() 
-    age  INTEGER+ 
 +# テーブルがない場合は作成 
 +$cmd.CommandText = @" 
 +CREATE TABLE IF NOT EXISTS logs 
 +    date TEXT NOT NULL
 +    level TEXT, 
 +    detail TEXT
 ); );
 "@ "@
-$command.ExecuteNonQuery() | Out-Null 
  
-# CSV を読み込み +$cmd.ExecuteNonQuery()
-$csvPath = ".\data.csv" +
-$rows = Import-Csv -Path $csvPath+
  
-# トランザクション開始(高速化) 
-$transaction = $connection.BeginTransaction() 
  
-foreach ($row in $rows) { +foreach ($row in $data) { 
-    $command = $connection.CreateCommand() +    $cmd = $conn.CreateCommand() 
-    $command.CommandText = "INSERT INTO people (idnameage) VALUES (@id, @name, @age);"+    $cmd.CommandText = "INSERT INTO logs (dateleveldetail) 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() 
-    $command.Parameters.Add((New-Object System.Data.SQLite.SQLiteParameter("@id",   $row.id)))   | Out-Null +</code>
-    $command.Parameters.Add((New-Object System.Data.SQLite.SQLiteParameter("@name", $row.name))) | Out-Null +
-    $command.Parameters.Add((New-Object System.Data.SQLite.SQLiteParameter("@age",  $row.age)))  | Out-Null+
  
-    $command.ExecuteNonQuery() | Out-Null +===== 例2 ===== 
-}+トランザクションを使うことによって、書き込み処理をまとめて実行することができるため処理を高速化できる。 
 +**$conn.BeginTransaction()**でトランザクションを開始し、**Comit()**で処理を確定する。 
 +<code powershell> 
 +Add-Type -AssemblyName System.Windows.Forms 
 +Add-Type -AssemblyName System.Drawing
  
-# コミット +sqlite3.dll を読み込む 
-$transaction.Commit()+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("処理を中止しました。"
 +}
  
-# 接続を閉じる 
-$connection.Close() 
  
-Write-Host "CSVデータをSQLiteにインポートしました。"+$conn.Close()
 </code> </code>
powershell/sqlite_import_csv.1756218142.txt.gz · 最終更新: 2025/08/26 23:22 by mikoto