本日はperlにて改行コードを動的に読み込む方法です。
動的な改行コードの判定・読み込み
実務で古いMACで作られたCSVが読み込めないという事態が発生。また当然、win環境でも読み込むために、動的に改行コードを判定してなおす必要が出てきました。
いろいろ悩んだんですが、まず改行コード判定の際には下記プログラムでの読み込みを行いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
sub replace_file_encoding{ my $self = shift; my ($file_path ) = @_; my $timestamp = open (IN, $file_path) or die "Error $file_path $!\n"; my $file_format; while (<IN>) { if( $_ =~ /\r\n/ ){ $file_format ="dos"; }elsif($_ =~ /\n/ ){ $file_format ="unix"; }elsif($_ =~ /\r/ ){ $file_format ="mac"; } } close (IN); return $file_format; } |
そして実際に改行コードを読み込ませるのは下記のプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
local $/; if( $file_format eq 'dos'){ $/ = "\r\n"; }elsif( $file_format eq 'unix'){ $/ = "\n"; }elsif( $file_format eq 'mac'){ $/ = "\r"; } my $param; if( $file_format eq 'mac') { $param = {eol=>"\r", binary => 1 }; }else{ $param = {eol=>"\n", binary => 1 }; } my $csv = Text::CSV_XS->new( $param ); |
多分、直すとこあると思うんですが・・・どうなんでしょう。
Mac のExcelで作ったCSVを適切にPerlで読むには?
Perlで改行コードがCRのファイルを読み込む方法
CPANライブラリ
http://search.cpan.org/~makamaka/Text-CSV-1.33/lib/Text/CSV.pm
ShitfJISとcp932について
もう一つ実務でローマ数字のみが文字化けという現象が発生しました。
どうやらcp932ファイルをsjisで読み込むとこのような事象が発生するようです。cp932とShitJISは完全に一緒ではないので注意しましょう。
[…] Perlでの動的改行コード読み込みに関して+cp932ネタ […]
こういうときに m/\R/ を使うのではないかと思いました。