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レポート処理やログの集計など、繰り返しの多い業務で力を発揮します。応用すればファイル名やタイムスタンプの追加も可能で、集計・分析業務の効率化につながります。