2
5

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 5 years have passed since last update.

PowerShellでファイル出力する際のメモ書き

Last updated at Posted at 2018-03-19

#目的
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相当の処理を行う/

2
5
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
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?