適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

【Get-Content,Out-File】テキストファイルの先頭に書き込む【PowerShell】

基幹システムから出力したCSVファイルにはヘッダがなくて、Excelで分析しようにもまずヘッダをいちいち書き込まなくてはならない・・・。

特に大容量のテキストファイルやCSVだと、開くだけでも大変。

そんなときは、PowerShellを使いましょう。

PowerShellでテキストファイルの先頭に書き込む方法の紹介です。

VBAでテキストの先頭に文字列を追加する方法については、こちら↓

www.tekizai.net

テキストファイルの先頭に文字列を追加する考え方

考え方は簡単。

追加したい文字列を新しいファイルに書き込み、そこに既存のテキストファイルの内容を追記するだけです。

例をあげてみましょう。

既存のテキストファイルは次のようなものだとします。

ファイル名 C:\test.csv 文字コード Shift-JIS

久保田 めぐみ,女,2020/9/3
浜口 和久,男,2021/6/25
田畑 禄郎,男,2021/6/8
松居 芳正,男,2021/5/3
有賀 孝太郎,男,2021/3/13
砂川 太朗,男,2020/8/20
徳永 法嗣,男,2021/1/13
山下 寿明,男,2020/9/10
安藤 千佳子,女,2021/5/11

見ていただくと、名前、性別、誕生日らしいカンマ区切りのテキストファイルになっています。

このままだと、Excel等で分析したいときにいちいちヘッダを付けてあげないといけません。

これに対して追加したい文字列は

名前,性別,誕生日

だとします。

完成形のCSVファイルは次のようにしたいと思います。

  • ファイル名 C:\outfile.csv
  • 文字コード Shift-JIS
名前,性別,誕生日
久保田 めぐみ,女,2020/9/3
浜口 和久,男,2021/6/25
田畑 禄郎,男,2021/6/8
松居 芳正,男,2021/5/3
有賀 孝太郎,男,2021/3/13
砂川 太朗,男,2020/8/20
徳永 法嗣,男,2021/1/13
山下 寿明,男,2020/9/10
安藤 千佳子,女,2021/5/11

これなら一目でわかって人にも優しいですね!

コマンド

まずは、あらかじめヘッダを書き込んだouffile.csvを準備します。

 
'名前,性別,誕生日'|Out-File -FilePath C:\outfile.csv -Encoding Default

Out-Fileコマンドはパイプラインで受け取った文字列を-FilePathで指定したパスに出力してくれます。

出力先のファイルが存在しない場合は、勝手に作ってくれます。

次にtest.csvの内容をGet-Contentコマンドで読み取り、先ほどと同じようにOut-Fileコマンドに渡してあげます。

 
Get-Content -Path C:\test.csv -Raw -Encoding Default |Out-File -FilePath C:\outfile.txt -Append -Encoding Default

VBAだとあんなに面倒だったことがPowerShellなら2行で済んでしまいました・・・。

たったこの2行です。

 
'名前,性別,誕生日'|Out-File -FilePath C:\outfile.csv -Encoding Default
Get-Content -Path C:\test.csv -Raw -Encoding Default |Out-File -FilePath C:\outfile.txt -Append -Encoding Default

ハマりポイント

ハマりポイントは3つです。

Encodingの指定を忘れない

Get-ContentとOut-FileではEncoding(文字コード)の指定ができます。

(古いPowerShellだとGet-Contentでオプションがありませんでしたが、そこは割愛します。)

このEncodingの指定を忘れるとBOM付のUnicodeで出力されます。

アプリケーションによっては文字化けすることがあるのでちゃんとEncodingの指定をお忘れなく。

Out-Fileの-Appendを忘れない

追記するときに-Appendオプションを忘れてしまうと、追記ではなく、上書きされてしまいます。

結果的に同じ内容のファイルができるだけですのでお忘れなく。

Get-Content -Rawを付けた方が処理スピードが速い

数行のテキストファイルだとあまり体感できないかもしれませんが、数万行になってくると-Rawを付けた方が速いようです。

-Rawオプションを指定しない場合、Get-Contentコマンドレットは、読み込んだファイルの内容を配列に変換します。

対して-Rawオプションは配列に変換することなく、そのままの内容を返します。

数行~数千行くらいであれば、速度の差は感じないとは思いますが・・・。

終わりに

PowerShellを使ってテキストファイルの先頭に文字列を書き込む方法でした。

PowerShellのGet-ContentコマンドとOut-Fileコマンドを組み合わせることでかなり簡単に実現することがきます。

VBAだとあんなに面倒だったのに、PowerShellだとめちゃくちゃ楽・・・。

もうPowerShellでいいや・・・。

もうVBAには戻れない・・・。

いや、VBAはVBAで便利なんですけどね。

ここまでお読みいただき、ありがとうございました。

テキストファイルを操作する記事

www.tekizai.net
www.tekizai.net
www.tekizai.net
www.tekizai.net