PowerShellでCSVの該当行をIO.StreamReaderで書き出す
Discussion
Closed
解決したいこと
パワーシェルで文字コード指定してCSVファイルの特定の行番号のレコードを抽出したかった
この際にIO.StreamReaderを使おうと思った
※もしかしたら、inport-csvコマンドですべて事足りたかもしれない
自分で試したこと
このスクリプトは割と新しいWindows環境でエラーなく実行ができた
だがしかし、古い環境で実行時エラーが起きた。
エラー内容に、ReadLineメソッドの呼び出しに失敗し実行できなかったと記されている
以下、スクリプト
#powershell
Function extract-row ($inputpath, $outputpath) {
<##任意の行番号をここに設定する##>
$rn = @(1, 2, 3)
# Specify Shift_JIS encoding
$reader = New-Object IO.StreamReader $inputpath, `
([System.Text.Encoding]::GetEncoding('shift_jis'))
$CSVObject = New-Object IO.StreamWriter $outputpath, `
$true, `
(New-Object System.Text.UTF8Encoding $true)
$num_row = 0
while ($null -ne ($line = $reader.ReadLine())) {
$num_row++
if ($num_row -in $rn) {
$fields = $line -split ","
$newLine = $fields -join ","
$CSVObject.WriteLine($newLine)
}
}
$reader.Close()
$CSVObject.Dispose()
}
思いついた解決策
ファイルパスを読み込んだ際にそれをcsvとして推測していないことに関係しているかもしれない。
なので、import-csvのコマンドで読み込むファイルを予めオブジェクトとして登録するように書き変える必要があるかもしれない
以下、修正後のスクリプト
#powershell
Function Extract-Row ($inputpath, $outputpath) {
$rn = @(1, 2, 3)
$csvData = Import-Csv -Path $inputpath
$csvData | Where-Object { $rn -contains $_.PSObject.Properties.Name } | Export-Csv -Path $outputpath -NoTypeInformation
}
<#使用例#>
Extract-Row -inputpath "Input.csv" -outputpath "Output.csv"
文字コードを指定するのと特定カラムにアペンドするように書き換えられる利点がなくなってしまったが目的が達成できる
なので、今回はこれ以上細かいことは考えないことにした
0