th4nk_y0u_y0sh1
@th4nk_y0u_y0sh1

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

追記:
冒頭でスクリプトが実行できなかったと書いたが、後で分かったのだがそもそもスクリプト実行が許可されていない環境だったことが分かった。

この環境からでもスクリプトを実行するにはPowershell ISEを立ち上げてスクリプトペインにソースコードを貼り付けてF5キーを押下すると実行できる。

一切の問題は自己解決してしまいました。

0Like

Your answer might help someone💌