Perl Shift_JIS(cp932) の CSV を JSON に変換する¶
cp932CSV2JSON.pl
#! /usr/bin/perl -w
# Windows-31j(cp932) の CSV を JSON 化する。1つの CSV row が1つの JSON obj になる仕様
use utf8; # use utf8 しないと JSON モジュールが正常に動作しないことがあるらしい。
use Text::CSV_XS;
use JSON::XS;
my $file = shift or die "no csv."; # コマンドライン引数から1ファイル読み込む
my $delimiter = ","; # field separator, タブ区切りのファイルもあったりするよね
my $csv = Text::CSV_XS->new({binary => 1, sep_char => $delimiter, eol => "\r\n"});
# binary => 1 しないとマルチバイト文字列は処理できません
# eol => "\r\n" 読み込み対象ファイルの改行スタイルにあわせる必要あり
# PerlIOレイヤーを使って読み込むCSVのエンコーディングをPerlに指示します
open my $fh, "<:encoding(cp932)", $file or die "$file: $!";
# 対象ファイルの1行目がヘッダー行である前提で
my $is_header = 1;
# 2行目以降のデータ行をハッシュ化するためにヘッダーを保存しておく変数
my $headers;
# ハッシュをJSONオブジェクトとして書き出すためのオブジェクトを作っておく
my $json = JSON::XS->new;
$json = $json->utf8(1); # このパラメータ指定によって utf8 文字列になった状態で print できるよ
$json = $json->pretty(0); # -> Python json で言うところの indent=None。改行なしでコンパクトな出力形式
while (my $row = $csv->getline($fh)) {
if ($is_header) {
$is_header = 0;
$headers = $row;
next;
}
# 2つの配列を ZIP するテクニック
my %hash;
@hash{@$headers} = map { s/\015//gr } @$row;
# 補足: \015 == \r
# 格データ要素の中に含まれているCRを削除している
print $json->encode(\%hash), "\n";
}
close $fh;
使用例: $ perl cp932CSV2JSON.pl win_sjis.csv > utf8.json 関連記事: iconv Windows-31j(CP932)(CRLF)とUTF-8(LF)間の変換 - memoize2 参考: CSV の取り扱い - perl-users.jp
Last modified: 2016-12-25 | ||
|
||
|
|
||
| © Shin Nakamura/BasicWerk 2008 - 2025 |