#目的
PowerShellでファイルの中身を検索し、指定した文字列が含む行を別ファイルに出力したい。
PowerShellにはLinuxでいう「grep」の様な「Select-String」コマンドがあるみたいなので実際に書いてみる。
参考(https://qiita.com/kmr_hryk/items/101c15c8c1c95469f53e)
#実際にファイル出力テスト
FileSeparate
ファイルパスなどの引数を変数に格納し、一行ずつ確認し、合致したらファイル出力するというコードを作成
#===============================================================================
# FileSeparate:ファイルの中から文字列を抽出し新しいファイルに出力
# Param:
# $filepath : ファイルパス
# $grepword : 抽出する文字列
# $newfilepath : 抽出した文字列が含む行の出力先csvファイル
#
# 使用例
# $filepath = "C:\work\999.TestDate\02.csv\test_20180315.csv"
# $grepword = "文字列"
# $newfilepath = "C:\work\999.TestDate\02.csv\newcsv_20180319.csv"
#===============================================================================
#1 引数を変数に格納
Param([string]$filepath, [string]$grepword, [string]$newfilepath)
#2 ファイルの中から文字列を抽出し新しいファイルに出力
$data=Get-Content $filepath
foreach($x in $data){
$tests = $x | Select-String $grepword
if($tests -ne $null){
$x | Select-String $grepword | Out-File $newfilepath
}
}
#確認
Get-Content $newfilepath
- 結果
PS C:\work\20. batch\05. FileSeparate> ./FileSeparate.ps1 "C:\work\999.TestDate\02.csv\test_20180315.csv" "文字列" "C:\work\999.TestDate\02.csv\newcsv_20180319.csv"
01,文字列,test
PS C:\work\20. batch\05. FileSeparate>
一行目に空行が入っている。ファイルを確認しても同様。
Select-String の箇所で空行が入っているように見受けられる。
どちらにしても一行目の空行を削除する必要がある。
FileSeparate2(空行消去修正)
#===============================================================================
# FileSeparate2:ファイルの中から文字列を抽出し新しいファイルに出力
# Param:
# $filepath : ファイルパス
# $grepword : 抽出する文字列
# $tmpfilepath : 空行が含む抽出した文字列が含む行の出力先csvファイル
# $newcsvpath : 抽出した文字列が含む行の出力先csvファイル
#
# 使用例
# $filepath = "C:\work\999.TestDate\02.csv\test_20180315.csv"
# $grepword = "文字列"
# $newfilepath = "C:\work\999.TestDate\02.csv\tmp_20180320.csv"
# $newcsvpath = "C:\work\999.TestDate\02.csv\newcsv.csv"
#===============================================================================
#1 引数を変数に格納
Param([string]$filepath, [string]$grepword, [string]$tmpfilepath, [string]$newcsvpath)
#2 ファイルの中から文字列を抽出し新しいファイルに出力
$data = Get-Content $filepath
foreach($x in $data){
$tests = $x | Select-String $grepword
if($tests -ne $null){
$x | Select-String $grepword | Out-File $tmpfilepath
}
}
#3 Set-Stringで抽出し出力した場合一行目空行が入るため空行を削除する。
$DelOne = Get-Content $newfilepath
$DelOne[0] = $null
$DelOne | Out-File $newcsvpath
#確認
Get-Content $newcsvpath
- 結果
PS C:\work\20. batch\05. FileSeparate> ./FileSeparate2.ps1 "C:\work\999.TestDate\02.csv\test_20180315.csv" "文字列" "C:\work\999.TestDate\02.csv\tmp_20180320.csv" "C:\work\999.TestDate\02.csv\newcsv.csv"
01,文字列,test
PS C:\work\20. batch\05. FileSeparate>
最低限の機能としては問題なさそうだが、末尾に3行空行入っているのは要修正。
見返すと纏められる個所など作りが荒い部分が多数・・・。後日修正予定。
参考サイト
https://qiita.com/kmr_hryk/items/101c15c8c1c95469f53e
https://orebibou.com/2015/01/powershellでsed相当の処理を行う/