param (
[string]$folderPath = "C:\path\to\csv_folder", # CSVファイルがあるフォルダ
[string]$outputFolderPath = "C:\path\to\output_sql", # SQLファイルの出力先フォルダ
[int]$batchSize = 2 # 1つのINSERT文に含めるデータの件数
)
# 出力フォルダが存在しない場合は作成
if (!(Test-Path -Path $outputFolderPath)) {
New-Item -ItemType Directory -Path $outputFolderPath | Out-Null
Write-Host "出力フォルダを作成しました: $outputFolderPath"
}
# フォルダ内のCSVファイルを取得
$csvFiles = Get-ChildItem -Path $folderPath -Filter "*.csv"
if ($csvFiles.Count -eq 0) {
Write-Host "指定したフォルダにCSVファイルがありません。"
exit
}
foreach ($csvFile in $csvFiles) {
$csvFilePath = $csvFile.FullName
Write-Host "処理中: $csvFilePath"
# ファイル名からテーブル名を取得(例: "EN123_顧客情報.csv" → "EN123_顧客情報")
if ($csvFile.BaseName -match "^([A-Za-z]{2}\d{3}_.+)$") {
$tableName = $matches[1]
} else {
Write-Host "ファイル名が指定の形式に一致しません: $csvFile.Name"
continue
}
# SQLファイルの出力パス
$outputFile = Join-Path -Path $outputFolderPath -ChildPath "$tableName.sql"
# CSVファイルを読み込む
$csvData = Import-Csv -Path $csvFilePath
# ヘッダー(カラム名)を取得
$columns = $csvData[0].PSObject.Properties.Name -join ", "
# SQL文を格納する変数
$sqlStatements = @()
$valuesBatch = @()
$recordCount = 0
# データ処理
foreach ($row in $csvData) {
$values = @()
foreach ($column in $csvData[0].PSObject.Properties.Name) {
$value = $row.$column
# NULL値処理と文字列のエスケープ処理
if ($value -eq $null -or $value -eq "") {
$values += "NULL"
} elseif ($value -match "^\d+(\.\d+)?$") {
$values += "$value" # 数値はそのまま
} else {
$escapedValue = $value -replace "'", "''" # シングルクオートをエスケープ
$values += "'$escapedValue'" # 文字列はクオート
}
}
# 最初のデータにはコンマを付けず、それ以降は前にコンマを付ける
if ($valuesBatch.Count -eq 0) {
$valuesBatch += "($($values -join ', '))"
} else {
$valuesBatch += "`n, ($($values -join ', '))"
}
$recordCount++
# 指定したバッチサイズごとにINSERT文を作成
if ($recordCount -eq $batchSize) {
$sqlStatements += "INSERT INTO [$tableName] ($columns) VALUES`n$($valuesBatch -join "`n")`n;"
$valuesBatch = @()
$recordCount = 0
}
}
# 残ったデータを処理
if ($valuesBatch.Count -gt 0) {
$sqlStatements += "INSERT INTO [$tableName] ($columns) VALUES`n$($valuesBatch -join "`n")`n;"
}
# SQLファイルに出力
$sqlStatements -join "`n" | Out-File -Encoding utf8 -FilePath $outputFile
Write-Host "SQLファイルが作成されました: $outputFile"
}
Write-Host "すべてのCSVファイルの処理が完了しました。"