freedom-_-qの勉強履歴

メモ書きが主になるかと思います。勉強強制のために一日一記事目指してます。頭良くないので間違いが多々あるかと思います。

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:リダイレクト>ではなぜかうまくできなかった。