改行コードを変えたいだけなんです
by fancycrave1
仕事で大量にあるテキストファイルの改行コードをLFからCRLFに変換をかけたいけどどうしよう…と言うことがありました。
もともとPowerShellの取得プログラムがあったのでそこに組み込むかと言うことで組み込みはしましたが、ふとテキストの扱いならPerlのほうが早いんじゃないのかと急に思い出し作ってみました。
なお、本当であればファイルサーバーにFTPとかが使えればアスキーモードで取得すれば楽に行けるんですがそうはいかなかったんで変換プロセスを組み込みました。
Perlに関してはど素人で10年以上前にちょろっと触ったっきりです。
コードに関してはググってコピペしたつぎはぎ状態のものになり、有識者に言わせると頭を抱えるようなものになっているはずです。
全体の流れ
- ファイルサーバーより定期的に改行コードLFのテキストファイルをSamba経由でコピーしてくる。
- WindowsPCの所定場所に保管。
- 改行コードをCRLFに変換する。
- まとめて月次リポート的な使い方をする。
Perlで書いてみた
PowerShellから実行
おおもと。PowerShellより引数付きでPerlを実行しています。
なお、PowerShellに関しては抜粋になります。
引数にはディレクトリを指定しその配下にあるすべてのファイルに対して改行コードの変換をかけています。
1 2 |
$perl = Start-Process -FilePath "C:\converter.pl" -WindowStyle Hidden -ArumentList "C:\CSV\" -PassThru Wait-Process -Id ($perl.id) |
Start-ProcessでPerlを呼び出すと即次に行ってしまうのでWait-Processで待たせるようにしています。
また、Perlの画面が出てくるのでHiddenで隠しています。
Perl部分
続いて、問題の改行コード変換Perl。
ファイル名は「converter.pl」という感じにしてあります。
「use strict」と「use warnings」を入れているのでお作法には厳しくなっています。
そのため、肝心の改行コード変換部分では警告が出てしまってます。
とりあえず、動いているからまぁいっかというダメプログラムっぷり。
周りに聞いてもPerlなんてわかんねと言う人ばっかりだったのでこれで良しとしています。
わたしも、何やってるかさっぱりです。知ってる人からするとひどいもんなんでしょうね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
use strict; use warnings; use File::Copy; my $dir = $ARGV[0]; if(! -d $dir) { die "Invalid argument."; } my @fileList; getFileList($dir, \@fileList); foreach my $file (@fileList) { if(-f $file) { open(my $fh, $file); binmode $fh; my $ifile = $file; my $ofile = "$file.txt"; open (IFILE, $ifile) or die "$!"; open (OFILE, ">$ofile") or die "$!"; while (<IFILE>) { # 改行コードの除去 's/\n/\r\n/g'; # なんか26行目で警告が出るけど動いてるからよし! # Useless use of a constant ("s/\\n/\\r\\n/g") in void context at C:\converter.pl line 26. print OFILE $_; } close (IFILE); close (OFILE); move($ofile, $ifile) or die "$!"; } } sub getFileList { my $dir = shift; my $ref_fileList = shift; # for output. opendir(my $dh, $dir); my @fileList = readdir($dh); closedir($dh); foreach my $file (sort @fileList) { if($file =~ /^\.{1,2}$/) { next; } if( -d "$dir/$file") { getFileList("$dir/$file", $ref_fileList); } else { push(@$ref_fileList, "$dir/$file"); } } } |
警告の部分は「関数がくるべきとこに関数が来てなくて、変数とかがきてるよ」といった感じの警告だそうです。
とはいうもののさっぱりです。
PowerShell VS Perl
とりあえず、動いているPerlですがPowerShellと比べるとどうなのかと言うとあくまで体感レベルまとめました。
- Perlのほうが処理速度は速い。
- PerlのほうがCPUの張り付きが無い。
RubyとかPythonとかにすると新しい分速度が変わったりするんでしょうか?
最後に
とりあえず、「Perl 改行コード変換」でググっても1行でやるワンライナーの書き方ばっかりで特定ディレクトリ配下にあるものをすべて変換したい!と言う時にどのように書いたらいいのかが非常に苦労しました。
ど素人のつぎはぎの超適当なプログラムなので仕事で使うのはどうかと言う話もありますが、今のところ動いているのでよし!としています。
参考にする人なんていないと思いますが、参考までにどうぞ。何かの足しになるかもしれません。
日々くだらないことを追い求め、黒歴史をまとめておくための自由なブログ。
あんまり役立つことは書きませんが主に日記・ゲームや買ったものについての記事を気まぐれで好き勝手書いています。