csvファイルの結合ついでにファイル名フォルダ名を新規カラムに追加
フォルダ構成
以下のようなファイルがあったとき、それらを縦に結合させ、ファイル名フォルダ名を新規カラムに追加したいことは稀に良くあると思う。
PS C:\Users\FReEdom\Desktop\ps_concat_csv_test> tree /f フォルダー パスの一覧: ボリューム Windows ボリューム シリアル番号は 58C4-731F です C:. │ concat.ps1 │ ├─Dir_A │ File_A.csv │ ├─Dir_B │ File_B.csv │ ├─Dir_C │ File_C.csv │ └─Dir_D File_D.csv PS C:\Users\FReEdom\Desktop\ps_concat_csv_test> ls -Recurse -File -Filter File*.csv |% {echo $_.FullName; cat $_.FullName} C:\Users\FReEdom\Desktop\ps_concat_csv_test\Dir_A\File_A.csv Header1,Header2,Header3,Header4 AAA,A111,A222,A333 BBB,B111,B222,B333 CCC,C111,C222,C333 DDD,D111,D222,D333 C:\Users\FReEdom\Desktop\ps_concat_csv_test\Dir_B\File_B.csv Header1,Header2,Header3,Header4 AAA,A111,A222,A333 BBB,B111,B222,B333 CCC,C111,C222,C333 DDD,D111,D222,D333 C:\Users\FReEdom\Desktop\ps_concat_csv_test\Dir_C\File_C.csv Header1,Header2,Header3,Header4 AAA,A111,A222,A333 BBB,B111,B222,B333 CCC,C111,C222,C333 DDD,D111,D222,D333 C:\Users\FReEdom\Desktop\ps_concat_csv_test\Dir_D\File_D.csv Header1,Header2,Header3,Header4 AAA,A111,A222,A333 BBB,B111,B222,B333 CCC,C111,C222,C333 DDD,D111,D222,D333
要件を達成できたスクリプト
こんなに短いスクリプトでも結構悩んだからメモしておく。
Get-ChildItem -Recurse -File -Filter *.csv |% { $FileName = $_.BaseName $ParentName = Split-Path (Split-Path $_.FullName -Parent) -Leaf Import-Csv $_.FullName | Select-Object *, @{Name='FileName';Expression={$FileName}}, @{Name='ParentName';Expression={$ParentName}} } | Export-Csv 'test.csv' -Encoding OEM -NoTypeInformation
PS C:\Users\FReEdom\Desktop\ps_concat_csv_test> Import-Csv .\test.csv | Format-Table Header1 Header2 Header3 Header4 FileName ParentName ------- ------- ------- ------- -------- ---------- AAA A111 A222 A333 File_D Dir_D BBB B111 B222 B333 File_D Dir_D CCC C111 C222 C333 File_D Dir_D DDD D111 D222 D333 File_D Dir_D AAA A111 A222 A333 File_D Dir_D BBB B111 B222 B333 File_D Dir_D CCC C111 C222 C333 File_D Dir_D DDD D111 D222 D333 File_D Dir_D AAA A111 A222 A333 File_D Dir_D BBB B111 B222 B333 File_D Dir_D CCC C111 C222 C333 File_D Dir_D DDD D111 D222 D333 File_D Dir_D AAA A111 A222 A333 File_D Dir_D BBB B111 B222 B333 File_D Dir_D CCC C111 C222 C333 File_D Dir_D DDD D111 D222 D333 File_D Dir_D
デフォルトでは""
で囲まれてしまう。
解決方法としては、出力後自力で消す(cat .\test.csv) -replace '"', '' | Out-File .\test.csv
*1。
もしくは新しいバージョン(PowerShell 7?)なら-UseQuotes Never
で消せるそう。
*1:リダイレクト>ではなぜかうまくできなかった。