複数CSVのマージ
全ファイル同一フォーマットでヘッダーありの例
Invoke-MargeCSV.ps1
param (
[parameter(mandatory=$true)][string]$Path
)
$heder = "ID","column1","column2","column3","column4","column5"
Get-ChildItem -Path $Path -Recurse -Filter "*.csv" | %{ Import-Csv -Path $_.FullName -Header $heder | Select-Object -Skip 1 } | Export-Csv -Encoding UTF8 -Path .\test.csv -NoClobber -NoTypeInformation
行別解説
1~3行目:探索対象のトップフォルダを指定
必須の引数として、再帰的に探索するトップのフォルダを指定できるようにしています。
param (
[parameter(mandatory=$true)][string]$Path
)
$Path
変数にパスを直書きでもOK
$Path = "C:\Users\myUser\Desktop"
4行目:CSVのヘッダーを指定
ヘッダーを文字列配列として指定しています。
ヘッダーなしの場合は不要
$heder = "ID","column1","column2","column3","column4","column5"
5行目の1パイプ目の処理:再帰的に拡張子.csv
のファイルを配列で取得
大文字小文字は区別されないため、.csv
または .CSV
いずれかを指定します。
Get-ChildItem -Path $Path -Recurse -Filter "*.csv"
.txt
を含めたくなったときは以下の様に指定する。
-Filter
を -Include
に変更しています。
Get-ChildItem -Path $Path -Recurse -Include "*.csv","*.txt"
5行目の2パイプ目の処理:1ファイルずつCSVファイルの中身を読み込み
Get-ChildItem で取得したファイル名のフルパスと$heder
で指定したヘッダーを利用し
CSVファイルの読み込みを行います。
(全てにヘッダー行が指定されている場合、Select-Object -Skip 1
で1行目(ヘッダー行)をスキップする。)
%{ Import-Csv -Path $_.FullName -Header $heder | Select-Object -Skip 1 }
5行目の3パイプ目の処理:CSVファイルの中身を書き込み
-Encoding
で文字コードを指定
-Path
で出力パスを指定
-NoClobber
で上書きを禁止(誤って上書かないように)
-NoTypeInformation
で不要なCSVの補足データが出力されないように指定
Export-Csv -Encoding UTF8 -Path .\test.csv -NoClobber -NoTypeInformation