findstrで特定文字列を含む行を検索すると、行頭にファイルパスがついてしまいます。
これが結構邪魔物で、CSVファイルから特定行のみを抽出して別のCSVファイルを作成すると、行頭にファイルパスがついてしまうので、正しくcsvファイルとして使うことが出来なくなってしまうんですよね。
この行頭のファイルパスを無くすことが出来ないか色々調べた結果、私がたどり着いた結論の覚え書きです。
コマンドプロンプトでは無理みたい
色々調べた結果、コマンドプロンプトでは無理があるようです。
検索されるCSVファイルのファイル名が一定の長さであれば無理やりやる方法もありそうですが、あまりにもスマートでないため却下。
PowerShellを使用して実現します。
コマンドプロンプトでは無理なので、PowerShellを使用して実現します。
PowerShellってなに?
正式には”Windows PowerShell”といい、コマンドプロンプトに代わってWindowsを管理するための新しいシェルです。
Windows7以降はPowerShellが標準でインストールされていますので、現在の環境では特別設定しなくても使用することが可能です。
仕様するコマンドレット
PowerShellでは”コマンドレット”というコマンドラインツールを使用します。
今回実現したい内容で使用するコマンドレットは以下の通りです。
・Select-String
指定されたテキストを検索します。
・Get-Childitem
Select-String単体ではサブディレクトリのファイルを指定することが出来ません。
Get-Childitemを使用するとサブディレクトリのファイルからも検索することが出来ます。
・Get-Content
指定された場所の内容を1行ずつ読み込みオブジェクトを返します。
・out-file
出力をファイルに送ります。
普通にSelect-Stringを実行すると画面に検索結果が表示されます。out-fileを使用すると、この検索結果を画面ではなくファイルに出力します。
使用例
たとえば、下記のようなフォルダ構成で、各CSVファイルの中には市区町村名が記載されているとします。
各CSVファイルから、市区町村名に”山”がついている行のみを抽出し、EXP.csvファイルに出力する場合は以下のようになります。
C:
└NIPPON
├KANTO
│├TOKYO.csv
│├KANAGAWA.csv
│├CHIBA.csv
│├SAITAMA.csv
│├GUNMA.csv
│├TOCHIGI.csv
│└IBARAKI.csv
├TOHOKU
│├AOMORI.csv
│├MIYAGI.csv
・
・
・
get-childitem -path C:\NIPPON -recurse -include *.csv | get-content | Select-String “山” -encoding default | out-file EXP.csv -width 999
簡単な解説
1.”get-childitem”で”NIPPON”フォルダ内の拡張子が”CSV”になっているファイルを取得します。
2.”get-content”で1.で取得したファイルを1行ずつ読み込みます。
3.”select-string”で2.で読み込んだ行に”山”が含まれているかチェックします。
4.”out-file”で3.の検索結果をCSVファイルに出力します。