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ファイルの処理が完了しました。"