適材適所

システム屋のくらげが気ままに書いているブログです。PowerShellやVBAなどプログラミング系の話をメインに書いています。

MENU

【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を付けた方がいいです。

Get-Contentコマンドの通常の動作は、読み込んだ内容を配列として保持します。

配列への変換に時間が多少かかるのではないかと思います。

対して-Rawオプションは生で読み込みます。

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