KIMUKAZU blog

健康とiMacに関する情報
最近は天体観察と公園散策の情報

法令条文・漢数字の数字変換

2014-12-29 00:13:29 | デジタル・インターネット
 法令条文の条項表記には、漢数字が用いられている。その一例として民法を参考文献[1]に示す。
 しかしながら、法令に用いられている漢数字の表記は、日常ではあまり使用されないので、一般人である私等には少々読みにくい。
 そこで、法令条文の漢数字表記を通常の数字表記に変換するプログラムを検討してみた。
 上記と同様な変換プログラムは、既に多くの例[2-5]が公開されているが、ここでは、perl[6]を用いた簡単なプログラム例を紹介する。
 プログラムの詳細な説明は略すが、Windows環境であれば、フリーのStrawberry Perl[6]をインストールした後、以下に記したperlスクリプト(UTF-8で保存すること)を実行することで法令条文の漢数字・数字変換が可能になる。

--
#!/usr/bin/perl -w
#
# kanji2num_win.pl ... scriptはutf-8で保存
#
# 入力/出力ファイルは、Shift-JISのテキストファイル

use strict;
use warnings;

use utf8;
use Encode;

=pod
my $enc_os = 'cp932';
binmode STDIN, ":encoding($enc_os)";
binmode STDOUT, ":encoding($enc_os)";
binmode STDERR, ":encoding($enc_os)";
=cut

die "usage: perl $0 <inputfile>\n" if (@ARGV !=1);

my $filename = $ARGV[0];
my $filename_new = $filename;
$filename_new =~ s/.txt/_new.txt/;

print "\n*** (kanji2num_win.pl) ***\n";
print "input :$filename\n";
print "output:$filename_new\n";
print "Processing... Wait minuetes.\n";

open (IN, "<", $filename) or die "Error n";
open (OUT,">", $filename_new) or die "Error \n";

while (<IN>) {
my $line;
my $trans;
my $i;
my @lists;

# 1行分を$lineに代入する。
$line = decode('shiftjis', $_);

# 号はタブで字下げする
$line =~ s/^([一二三四五六七八九十])/\t$1/g;

# "章"を変換する
@lists = ();
$trans = "";
$i = "";
push( @lists, ($line=~m/(第?[一二三四五六七八九〇十百千]+章[の]?[一二三四五六七八九〇十]*[の]?[一二三四五六七八九〇十]*)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/第?[一二三四五六七八九〇十百千]+章[の]?[一二三四五六七八九〇十]*[の]?[一二三四五六七八九〇十]*/$trans/;
}

# "条"を変換する
@lists = ();
$trans = "";
$i = "";
push( @lists, ($line=~m/(第?[一二三四五六七八九〇十百千]+条[の]?[一二三四五六七八九〇十]*[の]?[一二三四五六七八九〇十]*)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/第?[一二三四五六七八九〇十百千]+条[の]?[一二三四五六七八九〇十]*[の]?[一二三四五六七八九〇十]*/$trans/;
}

# "項"の見出しを変換
@lists = ();
push( @lists, ($line=~m/(^[一二三四五六七八九〇十百]+)/) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/^[一二三四五六七八九〇十百]+/$trans/;
}

# "項"を変換
@lists = ();
push( @lists, ($line=~m/(第?[一二三四五六七八九〇十百]+項)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/第?[一二三四五六七八九〇十百]+項/$trans/;
}

# "号"の見出しを変換
@lists = ();
push( @lists, ($line=~m/(^\t[一二三四五六七八九〇十百]+)/) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/^\t[一二三四五六七八九〇十百]+/$trans/;
}

# "号"を変換
@lists = ();
push( @lists, ($line=~m/(第?[一二三四五六七八九〇十百]+号)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/第?[一二三四五六七八九〇十百]+号/$trans/;
}

# "年"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+年)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+年/$trans/;
}

# "月"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十]+月)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十]+月/$trans/;
}

# "日"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+日)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+日/$trans/;
}

# "億、万"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九十百千]+[億万])/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九十百千]+[億万]/$trans/;
}

# "円"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+円)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+円/$trans/;
}

# "編"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+編)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+編/$trans/;
}

# "節"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+節)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+節/$trans/;
}

# "款"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+款)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+款/$trans/;
}

# "目"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+目)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+目/$trans/;
}

# "歳、才"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百]+[歳才])/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百]+[歳才]/$trans/;
}

# "級"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+級)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+級/$trans/;
}

# "時、分"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+[時分])/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+[時分]/$trans/;
}

# "人"を変換
@lists = ();
push( @lists, ($line=~m/([一二三四五六七八九〇十百千]+人)/g) );
foreach $i (@lists) {
$trans = &func_TransKansuuji( $i );
$line =~ s/[一二三四五六七八九〇十百千]+人/$trans/;
}

# 変換の終わった行をファイルに書き込む
$line = encode('shiftjis', $line);
print OUT $line;
}
close(IN);
close(OUT);
print "Completed.\n";

exit;

####################################
# Sub func_TransKansuuji
# 漢数字を全角算用数字に変換する
# 0-9999まで対応
####################################
sub func_TransKansuuji{

my $val;
$val = $_[0];

# 漢数字を変換する
$val =~ s/一/1/g;
$val =~ s/二/2/g;
$val =~ s/三/3/g;
$val =~ s/四/4/g;
$val =~ s/五/5/g;
$val =~ s/六/6/g;
$val =~ s/七/7/g;
$val =~ s/八/8/g;
$val =~ s/九/9/g;
$val =~ s/〇/0/g;

#
# 十の変換
#

# (十を削除) 2十1、、、9十9
$val =~ s/([23456789])十([123456789])/$1$2/g;

# (十を0に) 2十、3十、、、9十
$val =~ s/([23456789])十/$10/g;

# (十を1に) 十1-十9
$val =~ s/十([123456789])/1$1/g;

# (十を10に) 十
$val =~ s/十/10/g;

#
# 百の変換
#

# (百を削除) 2百10、、、、2百99
$val =~ s/([23456789])百([123456789][1234567890])/$1$2/g;
# (百を0に) 2百1ー2百9、、9百1-9百9
$val =~ s/([23456789])百([123456789])/$10$2/g;

# (百を00に)2百、3百、、、9百
$val =~ s/([23456789])百/$100/g;

# (百を1に) 百10、百11、、、百99
$val =~ s/百([123456789][1234567890])/1$1/g;

# (百を10に) 百1-百9
$val =~ s/百([123456789])/10$1/g;

# (百を100) 百
$val =~ s/百/100/g;

#
# 千の変換
#

# (千を削除)2千100、、9千999
$val =~ s/([23456789])千([123456789][1234567890][1234567890])/$1$2/g;

# (千を0に)2千10ー3千99、、、9千99
$val =~ s/([23456789])千([123456789][1234567890])/$10$2/g;

# (千を00に)2千1ー2千9、、9千1-9千9
$val =~ s/([23456789])千([123456789])/$100$2/g;

# (千を000に)2千、3千、、9千
$val =~ s/([23456789])千/$1000/g;

# (千を1に)千100-千999
$val =~ s/千([123456789][1234567890][1234567890])/1$1/g;

# (千を10に)千10ー千99
$val =~ s/千([123456789][1234567890])/10$1/g;

# (千を100に)千1ー千9
$val =~ s/千([123456789])/100$1/g;

# (千を1000に) 千
$val =~ s/千/1000/g;

return $val;
}
--

参考文献
(1)民法
(2)法令条文の漢数字を算用数字に変換
(3)漢数字をアラビア数字にスマートに変換する
(4)オートメーターを使って文字変換はできないものでしょうか?
(5)漢数字に変換
(6)Strawberry Perl for Windows
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする