複数のCSVファイルがドライブのあちこちにあって、これを1個のファイルにするためのPowerShellスクリプトを作ってみたいと思います。
#対象となるCSVファイル名の取り出し
カレントディレクトリ・子・孫フォルダに入っているcsvファイルを調べてフルパスを出力します。
├─果物
│ 東京店.csv
└─文房具
大阪店.csv
$files = (Get-ChildItem *.csv -Recurse).FullName
C:\Users\test\文房具\大阪店.csv
C:\Users\test\果物\東京店.csv
#対象となるファイルの結合
各ファイルからCSV形式のデータをインポートします。カレントディレクトリも検索の対象となっているので、結果は1個上のフォルダに出力することにします。
"番号","品名","値段"
"0001","りんご","100"
"0002","みかん","80"
"番号","品名","値段"
"0011","えんぴつ","50"
"0012","ノート","200"
Import-Csv $files -Encoding UTF8 | Export-Csv ..\結果.csv -Encoding UTF8
#TYPE System.Management.Automation.PSCustomObject
"番号","品名","値段"
"0011","えんぴつ","50"
"0012","ノート","200"
"0001","りんご","100"
"0002","みかん","80"
#CSVファイルの選別
フォルダ内の全CSVファイルが取り出したいファイルとは限りません。
├─店舗
│ 支店.csv
├─果物
│ 東京店.csv
└─文房具
大阪店.csv
"番号","店名","英語"
"001","東京店","TOKYO"
"002","大阪店","OSAKA"
上のような状況で、先のスクリプトを動かすと、下のようなCSVファイルが出力されます。
"番号","店名","英語"
"001","東京店","TOKYO"
"002","大阪店","OSAKA"
"0011",,
"0012",,
"0001",,
"0002",,
このため、出力したい項目が書かれたファイル基準.csv
の1行目と、先の対象ファイルの1行目が同じであるか確認するスクリプトを作ります。この基準.csv
も1個上のフォルダに置くことにします。
"番号","品名","値段"
$header = (Get-Content ..\基準.csv -Encoding UTF8)[0]
$files = foreach($tmp in $files) { if ($header -eq (Get-Content $tmp -Encoding UTF8)[0]) { $tmp;Write-Host "OK : $tmp" } else { Write-Host "NG : $tmp"} }
NG : C:\Users\test\店舗\支店.csv
OK : C:\Users\test\果物\東京店.csv
OK : C:\Users\test\文房具\大阪店.csv
C:\Users\test\果物\東京店.csv
C:\Users\test\文房具\大阪店.csv
#まとめる
上のスクリプトをまとめると、下のようになります。
$files = (Get-ChildItem *.csv -Recurse).FullName
$header = (Get-Content ..\基準.csv -Encoding UTF8)[0]
$files = foreach($tmp in $files) { if ($header -eq (Get-Content $tmp -Encoding UTF8)[0]) { $tmp;Write-Host "OK : $tmp" } else { Write-Host "NG : $tmp"} }
Import-Csv $files -Encoding UTF8 | Export-Csv ..\結果.csv -Encoding UTF8
#おわりに
PowerShellが扱うことができるデータには制限があるそうです。あまり大きなデータだと切れてしまうので注意してください。
まだ始めたばかりなので、もっとPowerShellっぽい良い書き方があると思いますが、それは今度勉強します。