読者です 読者をやめる 読者になる 読者になる

perlでShift_JISファイルを読み込みUTF-8で出力

Encode.pmとPerlIOの備忘録も兼ねて。
perlShift_JISCSVを読み込みUTF-8にて標準出力に出力。CSVの解析はText::CSV_XSを使用、PerlIOを使って入出力。

#!/usr/bin/perl

use strict;
use warnings;

use Text::CSV_XS;
use utf8; # このファイルはUTF-8

use Encode;
use open IN => ':encoding(shiftjis)';
binmode STDOUT => ':utf8';

if ($#ARGV == -1) {
    print STDERR "$0 CSV-file\n";
    exit 1;
}

my $CSV_FILE = $ARGV[0];
#my $csv = Text::CSV_XS->new({binary => 1, eol => "\x0d\x0a"});
my $csv = Text::CSV_XS->new({binary => 1});

# Shift_JISをdecodeして内部コード(unicodeフラグ付き)に変換して読み込む
# use openを指定しない場合はこちら
#open(my $fh, "<:encoding(shiftjis)", $CSV_FILE)
open(my $fh, $CSV_FILE) or die("Can not open $CSV_FILE:$!\n");
while (my $row = $csv->getline($fh)) {
    # 第一カラム
    my $col0 = $row->[0];
    if ($csv->combine(@$row)) {
        my $allcols = $csv->string();
        # binmodeの指定により、内部コード(unicodeフラグ付き)をUTF-8にencodeして出力される。
        print "第一カラム[$col0]:該当CSV行 = " . $allcols . "\n";
    }
}
close($fh);