2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShellで複数のCSVファイルを結合する

Last updated at Posted at 2021-05-28

複数のCSVファイルがドライブのあちこちにあって、これを1個のファイルにするためのPowerShellスクリプトを作ってみたいと思います。

#対象となるCSVファイル名の取り出し

カレントディレクトリ・子・孫フォルダに入っているcsvファイルを調べてフルパスを出力します。

フォルダ構造
├─果物
│      東京店.csv
└─文房具
       大阪店.csv
$files = (Get-ChildItem *.csv -Recurse).FullName
$files
C:\Users\test\文房具\大阪店.csv
C:\Users\test\果物\東京店.csv

#対象となるファイルの結合

各ファイルからCSV形式のデータをインポートします。カレントディレクトリも検索の対象となっているので、結果は1個上のフォルダに出力することにします。

東京店.csv
"番号","品名","値段"
"0001","りんご","100"
"0002","みかん","80"
大阪店.csv
"番号","品名","値段"
"0011","えんぴつ","50"
"0012","ノート","200"
Import-Csv $files -Encoding UTF8 | Export-Csv ..\結果.csv -Encoding UTF8
結果.csv
#TYPE System.Management.Automation.PSCustomObject
"番号","品名","値段"
"0011","えんぴつ","50"
"0012","ノート","200"
"0001","りんご","100"
"0002","みかん","80"

#CSVファイルの選別

フォルダ内の全CSVファイルが取り出したいファイルとは限りません。

フォルダ構造
├─店舗
│      支店.csv
├─果物
│      東京店.csv
└─文房具
       大阪店.csv
支店.csv
"番号","店名","英語"
"001","東京店","TOKYO"
"002","大阪店","OSAKA"

上のような状況で、先のスクリプトを動かすと、下のようなCSVファイルが出力されます。

失敗例
"番号","店名","英語"
"001","東京店","TOKYO"
"002","大阪店","OSAKA"
"0011",,
"0012",,
"0001",,
"0002",,

このため、出力したい項目が書かれたファイル基準.csvの1行目と、先の対象ファイルの1行目が同じであるか確認するスクリプトを作ります。この基準.csvも1個上のフォルダに置くことにします。

基準.csv
"番号","品名","値段"
$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
$files
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っぽい良い書き方があると思いますが、それは今度勉強します。

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?