#困ったことに
・csvでほしかったデータがdatファイルできた
・なぜか最終行に半角スペースが入っているため、そのままだとPostgreSQLにインポートすることができない
・わりとたくさんファイルがある
#やりたいこと
・ディレクトリ内にあるすべてのdatファイルの最終行だけを削除したい
・datファイルからcsvファイルへ変換したい
#はじめてのPowerShell
最初はJavaでやろうとしたのだけど、機種依存文字が含まれていてどうしても文字化けしてしまうので、バッチでやることにした。しかしDOS バッチでファイルの最終行を削除することは難しそうだったので、PowerShellを使ってみることにした。シェルスクリプトは触ったことがあるけどPowerShellは初めてだったので起動から全部調べたよー。
以下、私のように初めてPowerShellを触る人へ。
※ちなみに環境はWindows7です
###1. 起動方法
Windows + RでPowerShellを検索
###2. 試しに動かしてみる
ディレクトリ内のdatファイル情報がずらーっと出てくるはず
cd C:\work # ワークディレクトリに移動
Get-ChildItem * -include *.dat # ディレクトリ内のdatファイルを取得
###3. PowerShellスクリプトファイルを作る
$List=Get-ChildItem * -include *.dat
foreach($file in $List) {
$data = Get-Content $file #ファイルの中身を取得
$name = $file.name -replace ".dat", ".csv" #出力ファイル名(拡張子をcsvに置換)
$length = $data.length -1 #最終行番号を取得。配列のインデックスにするので-1をする
$data[$length] = $null #最終行を削除
$data | Out-File $name -Encoding default #csv拡張子でファイル出力
}
###4. 実行
この時はじめてps1ファイルを実行する人は実行ポリシーにひっかかってできないはず。
詳しくはここらへんのサイトをみてね。
WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する
# 実行ポリシーの変更(とりあえず今回ローカルファイルを動かせればOK)
Set-ExecutionPolicy RemoteSigned
# 実行
.\test.ps1
で、ターゲットディレクトリ内(この場合はC:\WORK)内のdatファイルはすべて最終行は削除され、拡張子が.csvになってファイル生成されましたとさ。動きとしては、ファイルから最終行を削除したっていうよりかは最終行以外をコピーしたcsvファイルを作ったっていうほうが正しいかな?実際ターゲットディレクトリ内には元のdatファイルとcsvファイルが混在してました。
他のもっとうまいやり方があるような気がするけど、今回は私の要件を満たしていたため、これでよしとします。
#参考サイト
WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する
PowerShellでsed相当の処理を行う