【PowerShell】複数のCSVファイルを結合して1つにまとめる方法

【PowerShell】複数のCSVファイルを結合して1つにまとめる方法 PowerShell

PowerShellでは、複数のCSVファイルを簡単に結合して1つのファイルにまとめることができます。ファイル形式が揃っていれば、数行のスクリプトで実現できるため、日々の業務効率化にも役立ちます。

CSVファイルの前提条件

CSVファイルを結合するには、以下の点が一致している必要があります。

  • カラムの構成が同一であること(同じ列名・順序)
  • ファイル形式が文字コードUTF-8またはShift-JISで保存されていること(混在すると文字化けの原因になります)

スクリプトの例 フォルダ内のCSVを一括結合

以下のスクリプトでは、特定のフォルダ内にあるCSVファイルをすべて読み込み、1つのCSVファイルにまとめて出力します。

# CSVファイルが格納されているフォルダのパス
$inputFolder = "C:\CSV\Input"

# 結合後のCSVファイルの出力先
$outputFile = "C:\CSV\output\merged.csv"

# 最初のファイルのヘッダーを保持して出力、それ以降はヘッダーを除いて追記
$first = $true

Get-ChildItem -Path $inputFolder -Filter *.csv | ForEach-Object {
    if ($first) {
        Get-Content $_.FullName | Out-File -FilePath $outputFile -Encoding UTF8
        $first = $false
    } else {
        (Get-Content $_.FullName | Select-Object -Skip 1) | Out-File -FilePath $outputFile -Encoding UTF8 -Append
    }
}
  • Get-ChildItemで対象フォルダ内のCSVファイルを一覧取得
  • 最初のファイルだけヘッダー付きで出力し、2つ目以降は1行目(ヘッダー)を除いて追記
  • Out-Fileで結合結果を出力。-Appendで追記可能

実行上の注意点

  • 出力先のファイルが既に存在している場合は上書きされるため、必要に応じてバックアップをとっておきましょう。
  • 文字コードを揃えておかないと、ファイル結合後に文字化けが発生する可能性があります。

応用 ファイル名をカラムに追加する

以下のようにファイル名を1列追加することで、元のファイルがどれだったかを追跡できるようになります。

$outputFile = "C:\CSV\output\merged_with_filename.csv"
$first = $true

Get-ChildItem -Path $inputFolder -Filter *.csv | ForEach-Object {
    $filename = $_.Name
    $csv = Import-Csv $_.FullName

    $csv | ForEach-Object {
        $_ | Add-Member -NotePropertyName "SourceFile" -NotePropertyValue $filename -Force
        $_
    }

    if ($first) {
        $csv | Export-Csv -Path $outputFile -NoTypeInformation -Encoding UTF8
        $first = $false
    } else {
        $csv | Export-Csv -Path $outputFile -NoTypeInformation -Encoding UTF8 -Append
    }
}

このスクリプトでは、各レコードにSourceFileというカラムを追加し、どのファイルから来たかを記録しています。

まとめ

PowerShellを使えば、複数のCSVファイルを手軽に一括結合できます。特に定型的なCSVレポート処理やログの集計など、繰り返しの多い業務で力を発揮します。応用すればファイル名やタイムスタンプの追加も可能で、集計・分析業務の効率化につながります。