line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
my $schema_file = __FILE__; |
2
|
|
|
|
|
|
|
$schema_file =~ s!\.pm!/schema.sql!; |
3
|
|
|
|
|
|
|
|
4
|
|
|
|
|
|
|
=encoding UTF-8 |
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
=head1 NAME |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
Geo::Postcodes::JP::DB - database of Japanese postal codes |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
=head1 SYNOPSIS |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
my $o = Geo::Postcodes::JP::DB->new ( |
13
|
|
|
|
|
|
|
db_file => '/path/to/sqlite/database', |
14
|
|
|
|
|
|
|
); |
15
|
|
|
|
|
|
|
my $address = $o->lookup_postcode ('3050054'); |
16
|
|
|
|
|
|
|
print $address->{ken}; |
17
|
|
|
|
|
|
|
# Prints 茨城県 |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=head1 DESCRIPTION |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
This module offers methods to create and access an SQLite database of |
22
|
|
|
|
|
|
|
Japanese postcodes. |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=head1 METHODS |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
All of these methods make use of an SQLite database file. All of the |
27
|
|
|
|
|
|
|
fields suffixed with C<_id> are identification numbers of the SQLite |
28
|
|
|
|
|
|
|
database itself. |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=cut |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
package Geo::Postcodes::JP::DB; |
33
|
|
|
|
|
|
|
require Exporter; |
34
|
|
|
|
|
|
|
@ISA = qw(Exporter); |
35
|
|
|
|
|
|
|
@EXPORT_OK = qw/ |
36
|
|
|
|
|
|
|
make_database |
37
|
|
|
|
|
|
|
create_database |
38
|
|
|
|
|
|
|
/; |
39
|
|
|
|
|
|
|
|
40
|
4
|
|
|
4
|
|
85811
|
use warnings; |
|
4
|
|
|
|
|
9
|
|
|
4
|
|
|
|
|
142
|
|
41
|
4
|
|
|
4
|
|
21
|
use strict; |
|
4
|
|
|
|
|
7
|
|
|
4
|
|
|
|
|
675
|
|
42
|
|
|
|
|
|
|
our $VERSION = '0.014'; |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
#line 42 "DB.pm.tmpl" |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
# Need the postcode-reading function. |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
use Geo::Postcodes::JP::Process |
50
|
|
|
|
|
|
|
qw/ |
51
|
|
|
|
|
|
|
read_ken_all |
52
|
|
|
|
|
|
|
process_line |
53
|
|
|
|
|
|
|
read_jigyosyo |
54
|
|
|
|
|
|
|
process_jigyosyo_line |
55
|
|
|
|
|
|
|
improve_postcodes |
56
|
|
|
|
|
|
|
/; |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
# Require DBI for communicating with the database. |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
use DBI; |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
# This is for converting the halfwidth (半角) katakana in the post |
63
|
|
|
|
|
|
|
# office file. |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
use Lingua::JA::Moji ':all'; |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
use utf8; |
68
|
|
|
|
|
|
|
use Carp; |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
sub insert_schema |
71
|
|
|
|
|
|
|
{ |
72
|
|
|
|
|
|
|
my ($o, $schema_file_subs) = @_; |
73
|
|
|
|
|
|
|
if ($schema_file_subs) { |
74
|
|
|
|
|
|
|
$schema_file = $schema_file_subs; |
75
|
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
open my $input, "<", $schema_file |
77
|
|
|
|
|
|
|
or die "Can't open schema file '$schema_file': $!"; |
78
|
|
|
|
|
|
|
my $schema = ''; |
79
|
|
|
|
|
|
|
while (<$input>) { |
80
|
|
|
|
|
|
|
$schema .= $_; |
81
|
|
|
|
|
|
|
} |
82
|
|
|
|
|
|
|
my @schema = split /;/, $schema; |
83
|
|
|
|
|
|
|
for my $statement (@schema) { |
84
|
|
|
|
|
|
|
$o->{dbh}->do ($statement); |
85
|
|
|
|
|
|
|
} |
86
|
|
|
|
|
|
|
} |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
# Make the database from the specified schema file. |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
sub make_database_from_schema |
91
|
|
|
|
|
|
|
{ |
92
|
|
|
|
|
|
|
my ($db_file, $schema_file) = @_; |
93
|
|
|
|
|
|
|
if (-f $db_file) { |
94
|
|
|
|
|
|
|
unlink $db_file |
95
|
|
|
|
|
|
|
or die "Error unlinking '$db_file': $!"; |
96
|
|
|
|
|
|
|
} |
97
|
|
|
|
|
|
|
my $o = __PACKAGE__->new ( |
98
|
|
|
|
|
|
|
db_file => $db_file, |
99
|
|
|
|
|
|
|
); |
100
|
|
|
|
|
|
|
$o->insert_schema ($schema_file); |
101
|
|
|
|
|
|
|
return $o; |
102
|
|
|
|
|
|
|
} |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
my $verbose; |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=head2 search_placename |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
$placename_id = $o->search_placename ($type, $kanji, $kana); |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
Generic search for a placename of type C<$type> by kanji name |
111
|
|
|
|
|
|
|
C<$kanji> and kana name C<$kana>. This is only used for the "ken" and |
112
|
|
|
|
|
|
|
the "jigyosyo" tables, because city and address names are ambiguous. |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
=cut |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
sub search_placename |
117
|
|
|
|
|
|
|
{ |
118
|
|
|
|
|
|
|
my ($o, $type, $kanji, $kana) = @_; |
119
|
|
|
|
|
|
|
if (! $o->{placename_search}{$type}) { |
120
|
|
|
|
|
|
|
my $placename_search_sql = <
|
121
|
|
|
|
|
|
|
select id from %s where kanji=? and kana=? |
122
|
|
|
|
|
|
|
EOF |
123
|
|
|
|
|
|
|
my $sql = sprintf ($placename_search_sql, $type); |
124
|
|
|
|
|
|
|
$o->{placename_search}{$type} = $o->{dbh}->prepare ($sql); |
125
|
|
|
|
|
|
|
} |
126
|
|
|
|
|
|
|
if ($verbose) { |
127
|
|
|
|
|
|
|
print "Searching for $kanji, $kana\n"; |
128
|
|
|
|
|
|
|
} |
129
|
|
|
|
|
|
|
$o->{placename_search}{$type}->execute ($kanji, $kana); |
130
|
|
|
|
|
|
|
my $placenames = $o->{placename_search}{$type}->fetchall_arrayref (); |
131
|
|
|
|
|
|
|
my $placename_id; |
132
|
|
|
|
|
|
|
if ($placenames) { |
133
|
|
|
|
|
|
|
if (@$placenames > 1) { |
134
|
|
|
|
|
|
|
croak "Search for '$kanji' and '$kana' was ambiguous"; |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
if (@$placenames == 1) { |
137
|
|
|
|
|
|
|
$placename_id = $placenames->[0]->[0]; |
138
|
|
|
|
|
|
|
} |
139
|
|
|
|
|
|
|
else { |
140
|
|
|
|
|
|
|
if ($verbose) { |
141
|
|
|
|
|
|
|
print "Not found.\n"; |
142
|
|
|
|
|
|
|
} |
143
|
|
|
|
|
|
|
} |
144
|
|
|
|
|
|
|
} |
145
|
|
|
|
|
|
|
else { |
146
|
|
|
|
|
|
|
die "Search failed to return a result"; |
147
|
|
|
|
|
|
|
} |
148
|
|
|
|
|
|
|
return $placename_id; |
149
|
|
|
|
|
|
|
} |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
=head2 city_search |
152
|
|
|
|
|
|
|
|
153
|
|
|
|
|
|
|
$city_id = $o->city_search ($kanji, $ken_id); |
154
|
|
|
|
|
|
|
|
155
|
|
|
|
|
|
|
Search for a city named C<$kanji> in prefecture identified by |
156
|
|
|
|
|
|
|
C<$ken_id>. There are some examples of cities with the same names in |
157
|
|
|
|
|
|
|
different prefectures. For example there is a 府中市 (Fuchuu-shi) in |
158
|
|
|
|
|
|
|
Tokyo and one in Hiroshima prefecture. Thus a "city_search" routine |
159
|
|
|
|
|
|
|
rather than the "search_placename" generic search is needed for |
160
|
|
|
|
|
|
|
cities. |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
=cut |
163
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
sub city_search |
165
|
|
|
|
|
|
|
{ |
166
|
|
|
|
|
|
|
my ($o, $kanji, $ken_id) = @_; |
167
|
|
|
|
|
|
|
if (! $o->{city_search}) { |
168
|
|
|
|
|
|
|
my $city_search_sql = <
|
169
|
|
|
|
|
|
|
select id from city where kanji=? and ken_id=? |
170
|
|
|
|
|
|
|
EOF |
171
|
|
|
|
|
|
|
$o->{city_search} = $o->{dbh}->prepare ($city_search_sql); |
172
|
|
|
|
|
|
|
} |
173
|
|
|
|
|
|
|
$o->{city_search}->execute ($kanji, $ken_id); |
174
|
|
|
|
|
|
|
my $cities = $o->{city_search}->fetchall_arrayref (); |
175
|
|
|
|
|
|
|
my $city_id; |
176
|
|
|
|
|
|
|
if ($cities) { |
177
|
|
|
|
|
|
|
if (@$cities > 1) { |
178
|
|
|
|
|
|
|
croak "Search for '$kanji' in ken $ken_id was ambiguous"; |
179
|
|
|
|
|
|
|
} |
180
|
|
|
|
|
|
|
if (@$cities == 1) { |
181
|
|
|
|
|
|
|
$city_id = $cities->[0]->[0]; |
182
|
|
|
|
|
|
|
} |
183
|
|
|
|
|
|
|
else { |
184
|
|
|
|
|
|
|
if ($verbose) { |
185
|
|
|
|
|
|
|
print "Not found.\n"; |
186
|
|
|
|
|
|
|
} |
187
|
|
|
|
|
|
|
} |
188
|
|
|
|
|
|
|
} |
189
|
|
|
|
|
|
|
else { |
190
|
|
|
|
|
|
|
die "Search failed to return a result"; |
191
|
|
|
|
|
|
|
} |
192
|
|
|
|
|
|
|
return $city_id; |
193
|
|
|
|
|
|
|
} |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
=head2 address_search |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
$address_id = $o->address_search ($kanji, $kana, $city_id); |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
Search for an "address" in a particular city, specified by C<$city_id>. |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
=cut |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
sub address_search |
204
|
|
|
|
|
|
|
{ |
205
|
|
|
|
|
|
|
my ($o, $kanji, $kana, $city_id) = @_; |
206
|
|
|
|
|
|
|
if (! $o->{address_search}) { |
207
|
|
|
|
|
|
|
my $address_search_sql = <
|
208
|
|
|
|
|
|
|
select id from address where kanji=? and kana=? and city_id=? |
209
|
|
|
|
|
|
|
EOF |
210
|
|
|
|
|
|
|
$o->{address_search} = $o->{dbh}->prepare ($address_search_sql); |
211
|
|
|
|
|
|
|
} |
212
|
|
|
|
|
|
|
$o->{address_search}->execute ($kanji, $kana, $city_id); |
213
|
|
|
|
|
|
|
my $addresses = $o->{address_search}->fetchall_arrayref (); |
214
|
|
|
|
|
|
|
my $address_id; |
215
|
|
|
|
|
|
|
if ($addresses) { |
216
|
|
|
|
|
|
|
if (@$addresses > 1) { |
217
|
|
|
|
|
|
|
croak "Search for '$kanji' and '$kana' in city $city_id was ambiguous"; |
218
|
|
|
|
|
|
|
} |
219
|
|
|
|
|
|
|
if (@$addresses == 1) { |
220
|
|
|
|
|
|
|
$address_id = $addresses->[0]->[0]; |
221
|
|
|
|
|
|
|
} |
222
|
|
|
|
|
|
|
else { |
223
|
|
|
|
|
|
|
if ($verbose) { |
224
|
|
|
|
|
|
|
print "Not found.\n"; |
225
|
|
|
|
|
|
|
} |
226
|
|
|
|
|
|
|
} |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
else { |
229
|
|
|
|
|
|
|
die "Search failed to return a result"; |
230
|
|
|
|
|
|
|
} |
231
|
|
|
|
|
|
|
return $address_id; |
232
|
|
|
|
|
|
|
} |
233
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
=head2 search_placename_kanji |
235
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
my $place_id = $o->search_placename_kanji ($type, $kanji); |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
Like L, but search for a place name using only the |
239
|
|
|
|
|
|
|
kanji for the name. |
240
|
|
|
|
|
|
|
|
241
|
|
|
|
|
|
|
=cut |
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
my $placename_search_kanji_sql = <
|
244
|
|
|
|
|
|
|
select id from %s where kanji=? |
245
|
|
|
|
|
|
|
EOF |
246
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
sub search_placename_kanji |
248
|
|
|
|
|
|
|
{ |
249
|
|
|
|
|
|
|
my ($o, $type, $kanji) = @_; |
250
|
|
|
|
|
|
|
if (! $o->{placename_search_kanji}{$type}) { |
251
|
|
|
|
|
|
|
my $sql = sprintf ($placename_search_kanji_sql, $type); |
252
|
|
|
|
|
|
|
$o->{placename_search_kanji}{$type} = $o->{dbh}->prepare ($sql); |
253
|
|
|
|
|
|
|
} |
254
|
|
|
|
|
|
|
$o->{placename_search_kanji}{$type}->execute ($kanji); |
255
|
|
|
|
|
|
|
my $placenames = $o->{placename_search_kanji}{$type}->fetchall_arrayref (); |
256
|
|
|
|
|
|
|
my $placename_id; |
257
|
|
|
|
|
|
|
if ($placenames) { |
258
|
|
|
|
|
|
|
if (@$placenames > 1) { |
259
|
|
|
|
|
|
|
croak "Search for '$kanji' was ambiguous"; |
260
|
|
|
|
|
|
|
} |
261
|
|
|
|
|
|
|
if (@$placenames == 1) { |
262
|
|
|
|
|
|
|
$placename_id = $placenames->[0]->[0]; |
263
|
|
|
|
|
|
|
} |
264
|
|
|
|
|
|
|
else { |
265
|
|
|
|
|
|
|
if ($verbose) { |
266
|
|
|
|
|
|
|
print "Not found.\n"; |
267
|
|
|
|
|
|
|
} |
268
|
|
|
|
|
|
|
} |
269
|
|
|
|
|
|
|
} |
270
|
|
|
|
|
|
|
else { |
271
|
|
|
|
|
|
|
die "Search failed to return a result"; |
272
|
|
|
|
|
|
|
} |
273
|
|
|
|
|
|
|
return $placename_id; |
274
|
|
|
|
|
|
|
} |
275
|
|
|
|
|
|
|
|
276
|
|
|
|
|
|
|
=head2 insert_postcode |
277
|
|
|
|
|
|
|
|
278
|
|
|
|
|
|
|
$o->insert_postcode ($postcode, $address_id); |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
Insert a postcode C<$postcode> into the table of postcodes with |
281
|
|
|
|
|
|
|
corresponding address C<$address_id>. The address identification |
282
|
|
|
|
|
|
|
number, C<$address_id>, is usually got from L or |
283
|
|
|
|
|
|
|
L. This method is for addresses which are not |
284
|
|
|
|
|
|
|
jigyosyo (places of business). Addresses for places of business should |
285
|
|
|
|
|
|
|
use L. |
286
|
|
|
|
|
|
|
|
287
|
|
|
|
|
|
|
=cut |
288
|
|
|
|
|
|
|
|
289
|
|
|
|
|
|
|
|
290
|
|
|
|
|
|
|
# Insert a postcode with an address. |
291
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
sub insert_postcode |
293
|
|
|
|
|
|
|
{ |
294
|
|
|
|
|
|
|
my ($o, $postcode, $address_id) = @_; |
295
|
|
|
|
|
|
|
if (! $postcode) { |
296
|
|
|
|
|
|
|
die "No postcode"; |
297
|
|
|
|
|
|
|
} |
298
|
|
|
|
|
|
|
if (! $o->{postcode_insert_sth}) { |
299
|
|
|
|
|
|
|
# SQL to insert postcodes into the table. |
300
|
|
|
|
|
|
|
my $postcode_insert_sql = <
|
301
|
|
|
|
|
|
|
insert into postcodes (postcode, address_id) |
302
|
|
|
|
|
|
|
values (?, ?) |
303
|
|
|
|
|
|
|
EOF |
304
|
|
|
|
|
|
|
$o->{postcode_insert_sth} = $o->{dbh}->prepare ($postcode_insert_sql); |
305
|
|
|
|
|
|
|
} |
306
|
|
|
|
|
|
|
$o->{postcode_insert_sth}->execute ($postcode, $address_id); |
307
|
|
|
|
|
|
|
} |
308
|
|
|
|
|
|
|
|
309
|
|
|
|
|
|
|
=head2 jigyosyo_insert_postcode |
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
$o->jigyosyo_insert_postcode ($postcode, $address_id, $jigyosyo_id); |
312
|
|
|
|
|
|
|
|
313
|
|
|
|
|
|
|
Insert a postcode for a "jigyosyo" identified by C<$jigyosyo_id> into |
314
|
|
|
|
|
|
|
the table. $Jigyosyo_id is usually got from |
315
|
|
|
|
|
|
|
L. C<$Address_id> is as described in the |
316
|
|
|
|
|
|
|
documentation of L. |
317
|
|
|
|
|
|
|
|
318
|
|
|
|
|
|
|
=cut |
319
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
sub jigyosyo_insert_postcode |
321
|
|
|
|
|
|
|
{ |
322
|
|
|
|
|
|
|
my ($o, $postcode, $address_id, $jigyosyo_id) = @_; |
323
|
|
|
|
|
|
|
if (! $postcode) { |
324
|
|
|
|
|
|
|
die "No postcode"; |
325
|
|
|
|
|
|
|
} |
326
|
|
|
|
|
|
|
if (! $o->{jigyosyo_postcode_insert_sth}) { |
327
|
|
|
|
|
|
|
# SQL to insert postcodes with jigyosyo into the table. |
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
my $jigyosyo_postcode_insert_sql = <
|
330
|
|
|
|
|
|
|
insert into postcodes (postcode, address_id, jigyosyo_id) |
331
|
|
|
|
|
|
|
values (?, ?, ?) |
332
|
|
|
|
|
|
|
EOF |
333
|
|
|
|
|
|
|
$o->{jigyosyo_postcode_insert_sth} = $o->{dbh}->prepare ($jigyosyo_postcode_insert_sql); |
334
|
|
|
|
|
|
|
} |
335
|
|
|
|
|
|
|
$o->{jigyosyo_postcode_insert_sth}->execute ($postcode, |
336
|
|
|
|
|
|
|
$address_id, $jigyosyo_id); |
337
|
|
|
|
|
|
|
} |
338
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
=head2 jigyosyo_insert |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
my $jigyosyo_id = $o->jigyosyo_insert ($kanji, $kana, $street_number); |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
Insert a "jigyosyo" into the table of them with kanji C<$kanji>, kana |
344
|
|
|
|
|
|
|
C<$kana>, street number C<$street_number>, and return the ID number of |
345
|
|
|
|
|
|
|
the entry. |
346
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
=cut |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
sub jigyosyo_insert |
350
|
|
|
|
|
|
|
{ |
351
|
|
|
|
|
|
|
my ($o, $kanji, $kana, $street_number) = @_; |
352
|
|
|
|
|
|
|
if ($verbose) { |
353
|
|
|
|
|
|
|
print "Inserting jigyosyo $kanji/$kana/$street_number.\n"; |
354
|
|
|
|
|
|
|
} |
355
|
|
|
|
|
|
|
if (! $o->{jigyosyo_insert_sth}) { |
356
|
|
|
|
|
|
|
# Format for the SQL to insert kanji, kana into the place name |
357
|
|
|
|
|
|
|
# table. |
358
|
|
|
|
|
|
|
my $jigyosyo_insert_sql = <<'EOF'; |
359
|
|
|
|
|
|
|
insert into jigyosyo (kanji, kana, street_number) values (?, ?, ?) |
360
|
|
|
|
|
|
|
EOF |
361
|
|
|
|
|
|
|
$o->{jigyosyo_insert_sth} = $o->{dbh}->prepare ($jigyosyo_insert_sql); |
362
|
|
|
|
|
|
|
} |
363
|
|
|
|
|
|
|
$o->{jigyosyo_insert_sth}->execute ($kanji, $kana, $street_number); |
364
|
|
|
|
|
|
|
my $id = $o->{dbh}->last_insert_id (0, 0, 0, 0); |
365
|
|
|
|
|
|
|
return $id; |
366
|
|
|
|
|
|
|
} |
367
|
|
|
|
|
|
|
|
368
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
|
370
|
|
|
|
|
|
|
=head2 ken_insert |
371
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
my $ken_id = $o->ken_insert ($kanji, $kana); |
373
|
|
|
|
|
|
|
|
374
|
|
|
|
|
|
|
Insert a prefecture into the table of prefectures with the name |
375
|
|
|
|
|
|
|
C<$kanji> in kanji and C<$kana> in kana. |
376
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
=cut |
378
|
|
|
|
|
|
|
|
379
|
|
|
|
|
|
|
sub ken_insert |
380
|
|
|
|
|
|
|
{ |
381
|
|
|
|
|
|
|
my ($o, $kanji, $kana) = @_; |
382
|
|
|
|
|
|
|
if ($verbose) { |
383
|
|
|
|
|
|
|
print "Inserting ken $kanji/$kana\n"; |
384
|
|
|
|
|
|
|
} |
385
|
|
|
|
|
|
|
if (! $o->{ken_insert_sth}) { |
386
|
|
|
|
|
|
|
# Format for the SQL to insert kanji, kana into the place name table. |
387
|
|
|
|
|
|
|
my $ken_insert_sql = <<'EOF'; |
388
|
|
|
|
|
|
|
insert into ken (kanji, kana) values (?, ?) |
389
|
|
|
|
|
|
|
EOF |
390
|
|
|
|
|
|
|
$o->{ken_insert_sth} = $o->{dbh}->prepare ($ken_insert_sql); |
391
|
|
|
|
|
|
|
} |
392
|
|
|
|
|
|
|
$o->{ken_insert_sth}->execute ($kanji, $kana); |
393
|
|
|
|
|
|
|
my $id = $o->{dbh}->last_insert_id (0, 0, 0, 0); |
394
|
|
|
|
|
|
|
return $id; |
395
|
|
|
|
|
|
|
} |
396
|
|
|
|
|
|
|
|
397
|
|
|
|
|
|
|
# City |
398
|
|
|
|
|
|
|
|
399
|
|
|
|
|
|
|
=head2 city_insert |
400
|
|
|
|
|
|
|
|
401
|
|
|
|
|
|
|
my $city_id = $o->city_insert ($kanji, $kana, $ken_id); |
402
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
Insert a city into the table of cities with kanji name C<$kanji>, kana |
404
|
|
|
|
|
|
|
name C<$kana>, which is in the prefecture specified by C<$ken_id>. |
405
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
C<$Ken_id> specifies the prefecture to which the city belongs. |
407
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
=cut |
409
|
|
|
|
|
|
|
|
410
|
|
|
|
|
|
|
sub city_insert |
411
|
|
|
|
|
|
|
{ |
412
|
|
|
|
|
|
|
my ($o, $kanji, $kana, $ken_id) = @_; |
413
|
|
|
|
|
|
|
if (! $o->{city_insert_sth}) { |
414
|
|
|
|
|
|
|
my $city_insert_sql = <<'EOF'; |
415
|
|
|
|
|
|
|
insert into city (kanji, kana, ken_id) values (?, ?, ?) |
416
|
|
|
|
|
|
|
EOF |
417
|
|
|
|
|
|
|
$o->{city_insert_sth} = $o->{dbh}->prepare ($city_insert_sql); |
418
|
|
|
|
|
|
|
} |
419
|
|
|
|
|
|
|
$o->{city_insert_sth}->execute ($kanji, $kana, $ken_id); |
420
|
|
|
|
|
|
|
my $id = $o->{dbh}->last_insert_id (0, 0, 0, 0); |
421
|
|
|
|
|
|
|
return $id; |
422
|
|
|
|
|
|
|
} |
423
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
# Address |
425
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
=head2 address_insert |
427
|
|
|
|
|
|
|
|
428
|
|
|
|
|
|
|
my $address_id = $o->address_insert ($kanji, $kana, $city_id); |
429
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
Insert an address into the table of addresses with kanji name |
431
|
|
|
|
|
|
|
C<$kanji>, kana name C<$kana>, and city ID C<$city_id>. This is an |
432
|
|
|
|
|
|
|
internal routine used in the construction of the database from the |
433
|
|
|
|
|
|
|
data file. |
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
=cut |
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
sub address_insert |
438
|
|
|
|
|
|
|
{ |
439
|
|
|
|
|
|
|
my ($o, $kanji, $kana, $city_id) = @_; |
440
|
|
|
|
|
|
|
if (! $o->{address_insert_sth}) { |
441
|
|
|
|
|
|
|
my $address_insert_sql = <<'EOF'; |
442
|
|
|
|
|
|
|
insert into address (kanji, kana, city_id) values (?, ?, ?) |
443
|
|
|
|
|
|
|
EOF |
444
|
|
|
|
|
|
|
$o->{address_insert_sth} = $o->{dbh}->prepare ($address_insert_sql); |
445
|
|
|
|
|
|
|
} |
446
|
|
|
|
|
|
|
$o->{address_insert_sth}->execute ($kanji, $kana, $city_id); |
447
|
|
|
|
|
|
|
my $id = $o->{dbh}->last_insert_id (0, 0, 0, 0); |
448
|
|
|
|
|
|
|
return $id; |
449
|
|
|
|
|
|
|
} |
450
|
|
|
|
|
|
|
|
451
|
|
|
|
|
|
|
=head2 db_connect |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
$o->db_connect ('/path/to/database/file'); |
454
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
Connect to the database specified. |
456
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
=cut |
458
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
sub db_connect |
460
|
|
|
|
|
|
|
{ |
461
|
|
|
|
|
|
|
my ($o, $db_file) = @_; |
462
|
|
|
|
|
|
|
$o->{dbh} = DBI->connect ("dbi:SQLite:dbname=$db_file", "", "", |
463
|
|
|
|
|
|
|
{ |
464
|
|
|
|
|
|
|
RaiseError => 1, |
465
|
|
|
|
|
|
|
# Set this to '1' to avoid mojibake. |
466
|
|
|
|
|
|
|
sqlite_unicode => 1, |
467
|
|
|
|
|
|
|
} |
468
|
|
|
|
|
|
|
); |
469
|
|
|
|
|
|
|
$o->{db_file} = $db_file; |
470
|
|
|
|
|
|
|
} |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
=head2 insert_postcodes |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
$o->insert_postcodes ($postcodes); |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
Insert the postcodes in the array reference C<$postcodes> into the |
477
|
|
|
|
|
|
|
database specified by L. |
478
|
|
|
|
|
|
|
|
479
|
|
|
|
|
|
|
=cut |
480
|
|
|
|
|
|
|
|
481
|
|
|
|
|
|
|
sub insert_postcodes |
482
|
|
|
|
|
|
|
{ |
483
|
|
|
|
|
|
|
my ($o, $postcodes) = @_; |
484
|
|
|
|
|
|
|
|
485
|
|
|
|
|
|
|
$o->{dbh}->{AutoCommit} = 0; |
486
|
|
|
|
|
|
|
for my $postcode (@$postcodes) { |
487
|
|
|
|
|
|
|
my %ids; |
488
|
|
|
|
|
|
|
my %values = process_line ($postcode); |
489
|
|
|
|
|
|
|
my $ken_kana = hw2katakana ($values{ken_kana}); |
490
|
|
|
|
|
|
|
my $ken_kanji = $values{ken_kanji}; |
491
|
|
|
|
|
|
|
my $ken_id = $o->search_placename ('ken', $ken_kanji, $ken_kana); |
492
|
|
|
|
|
|
|
if (! defined $ken_id) { |
493
|
|
|
|
|
|
|
$ken_id = $o->ken_insert ($ken_kanji, $ken_kana); |
494
|
|
|
|
|
|
|
} |
495
|
|
|
|
|
|
|
my $city_kana = hw2katakana ($values{city_kana}); |
496
|
|
|
|
|
|
|
my $city_kanji = $values{city_kanji}; |
497
|
|
|
|
|
|
|
my $city_id = $o->city_search ($city_kanji, $ken_id); |
498
|
|
|
|
|
|
|
if (! defined $city_id) { |
499
|
|
|
|
|
|
|
$city_id = $o->city_insert ( |
500
|
|
|
|
|
|
|
$city_kanji, |
501
|
|
|
|
|
|
|
$city_kana, |
502
|
|
|
|
|
|
|
$ken_id |
503
|
|
|
|
|
|
|
); |
504
|
|
|
|
|
|
|
} |
505
|
|
|
|
|
|
|
my $address_kana = hw2katakana ($values{address_kana}); |
506
|
|
|
|
|
|
|
my $address_kanji = $values{address_kanji}; |
507
|
|
|
|
|
|
|
my $address_id = $o->address_search ( |
508
|
|
|
|
|
|
|
$address_kanji, |
509
|
|
|
|
|
|
|
$address_kana, |
510
|
|
|
|
|
|
|
$city_id, |
511
|
|
|
|
|
|
|
); |
512
|
|
|
|
|
|
|
if (! defined $address_id) { |
513
|
|
|
|
|
|
|
$address_id = $o->address_insert ( |
514
|
|
|
|
|
|
|
$address_kanji, |
515
|
|
|
|
|
|
|
$address_kana, |
516
|
|
|
|
|
|
|
$city_id, |
517
|
|
|
|
|
|
|
); |
518
|
|
|
|
|
|
|
} |
519
|
|
|
|
|
|
|
my $pc = $values{new_postcode}; |
520
|
|
|
|
|
|
|
if (! defined $pc) { |
521
|
|
|
|
|
|
|
die "No postcode defined"; |
522
|
|
|
|
|
|
|
} |
523
|
|
|
|
|
|
|
$o->insert_postcode ($pc, $address_id); |
524
|
|
|
|
|
|
|
} |
525
|
|
|
|
|
|
|
$o->{dbh}->commit (); |
526
|
|
|
|
|
|
|
$o->{dbh}->{AutoCommit} = 1; |
527
|
|
|
|
|
|
|
} |
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
=head2 insert_postcode_file |
530
|
|
|
|
|
|
|
|
531
|
|
|
|
|
|
|
insert_postcode_file ( |
532
|
|
|
|
|
|
|
db_file => '/path/to/database/file', |
533
|
|
|
|
|
|
|
postcode_file => '/path/to/postcode/file', |
534
|
|
|
|
|
|
|
); |
535
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
Insert the postcodes in the file specified by C into |
537
|
|
|
|
|
|
|
the database specified by C. |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
This uses the L method of L to |
540
|
|
|
|
|
|
|
read the data, and the L function of the same module to improve |
541
|
|
|
|
|
|
|
the data. |
542
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
=cut |
544
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
sub insert_postcode_file |
546
|
|
|
|
|
|
|
{ |
547
|
|
|
|
|
|
|
my ($o, %inputs) = @_; |
548
|
|
|
|
|
|
|
my $verbose = $inputs{verbose}; |
549
|
|
|
|
|
|
|
my $postcode_file = $inputs{postcode_file}; |
550
|
|
|
|
|
|
|
if (! $postcode_file) { |
551
|
|
|
|
|
|
|
croak "Specify the file containing the postcodes with postcode_file => 'file name'"; |
552
|
|
|
|
|
|
|
} |
553
|
|
|
|
|
|
|
if ($verbose) { |
554
|
|
|
|
|
|
|
print "Reading postcodes from '$postcode_file'.\n"; |
555
|
|
|
|
|
|
|
} |
556
|
|
|
|
|
|
|
my $postcodes = read_ken_all ($postcode_file); |
557
|
|
|
|
|
|
|
$postcodes = improve_postcodes ($postcodes); |
558
|
|
|
|
|
|
|
$o->insert_postcodes ($postcodes); |
559
|
|
|
|
|
|
|
} |
560
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
=head2 lookup_address |
562
|
|
|
|
|
|
|
|
563
|
|
|
|
|
|
|
my $address_id = $o->lookup_address ( |
564
|
|
|
|
|
|
|
ken => '沖縄県', |
565
|
|
|
|
|
|
|
city => '宜野湾市', |
566
|
|
|
|
|
|
|
address => '上原', |
567
|
|
|
|
|
|
|
); |
568
|
|
|
|
|
|
|
|
569
|
|
|
|
|
|
|
Look up an address id number from the kanji versions of the prefecture |
570
|
|
|
|
|
|
|
name, the city name, and the address name. |
571
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
=cut |
573
|
|
|
|
|
|
|
|
574
|
|
|
|
|
|
|
sub lookup_address |
575
|
|
|
|
|
|
|
{ |
576
|
|
|
|
|
|
|
my ($o, %inputs) = @_; |
577
|
|
|
|
|
|
|
if (! $o->{lookup_sth}) { |
578
|
|
|
|
|
|
|
my $sql = <
|
579
|
|
|
|
|
|
|
select address.id from ken, city, address where |
580
|
|
|
|
|
|
|
ken.kanji = ? and |
581
|
|
|
|
|
|
|
city.kanji = ? and |
582
|
|
|
|
|
|
|
address.kanji = ? and |
583
|
|
|
|
|
|
|
ken.id = city.ken_id and |
584
|
|
|
|
|
|
|
city.id = address.city_id |
585
|
|
|
|
|
|
|
EOF |
586
|
|
|
|
|
|
|
$o->{lookup_sth} = $o->{dbh}->prepare ($sql); |
587
|
|
|
|
|
|
|
} |
588
|
|
|
|
|
|
|
$o->{lookup_sth}->execute ($inputs{ken}, $inputs{city}, $inputs{address}); |
589
|
|
|
|
|
|
|
my $return = $o->{lookup_sth}->fetchall_arrayref (); |
590
|
|
|
|
|
|
|
if (scalar @$return > 1) { |
591
|
|
|
|
|
|
|
die "Too many results for $inputs{ken}, $inputs{city}, $inputs{address}"; |
592
|
|
|
|
|
|
|
} |
593
|
|
|
|
|
|
|
if ($return->[0]) { |
594
|
|
|
|
|
|
|
return $return->[0]->[0]; |
595
|
|
|
|
|
|
|
} |
596
|
|
|
|
|
|
|
else { |
597
|
|
|
|
|
|
|
return (); |
598
|
|
|
|
|
|
|
} |
599
|
|
|
|
|
|
|
} |
600
|
|
|
|
|
|
|
|
601
|
|
|
|
|
|
|
=head2 add_jigyosyo |
602
|
|
|
|
|
|
|
|
603
|
|
|
|
|
|
|
$o->add_jigyosyo ( |
604
|
|
|
|
|
|
|
db_file => '/path/to/database/file', |
605
|
|
|
|
|
|
|
jigyosyo_file => '/path/to/jigyosyo.csv', |
606
|
|
|
|
|
|
|
); |
607
|
|
|
|
|
|
|
|
608
|
|
|
|
|
|
|
Add the list of place-of-business postcodes from C to |
609
|
|
|
|
|
|
|
the database specified by C. |
610
|
|
|
|
|
|
|
|
611
|
|
|
|
|
|
|
=cut |
612
|
|
|
|
|
|
|
|
613
|
|
|
|
|
|
|
sub add_jigyosyo |
614
|
|
|
|
|
|
|
{ |
615
|
|
|
|
|
|
|
my ($o, %inputs) = @_; |
616
|
|
|
|
|
|
|
my %total; |
617
|
|
|
|
|
|
|
$total{found} = 0; |
618
|
|
|
|
|
|
|
$o->{dbh}->{AutoCommit} = 0; |
619
|
|
|
|
|
|
|
my $jigyosyo_file = $inputs{jigyosyo_file}; |
620
|
|
|
|
|
|
|
my $jigyosyo_postcodes = read_jigyosyo ($jigyosyo_file); |
621
|
|
|
|
|
|
|
for my $postcode (@$jigyosyo_postcodes) { |
622
|
|
|
|
|
|
|
my %values = process_jigyosyo_line ($postcode); |
623
|
|
|
|
|
|
|
my $ken = $values{ken_kanji}; |
624
|
|
|
|
|
|
|
my $city = $values{city_kanji}; |
625
|
|
|
|
|
|
|
my $address = $values{address_kanji}; |
626
|
|
|
|
|
|
|
# Remove the "aza" or "ooaza" from the beginning of the name. |
627
|
|
|
|
|
|
|
if ($address =~ /(^|大)字/) { |
628
|
|
|
|
|
|
|
$address =~ s/(^|大)字//; |
629
|
|
|
|
|
|
|
} |
630
|
|
|
|
|
|
|
my $address_id = $o->lookup_address ( |
631
|
|
|
|
|
|
|
ken => $ken, |
632
|
|
|
|
|
|
|
city => $city, |
633
|
|
|
|
|
|
|
address => $address, |
634
|
|
|
|
|
|
|
); |
635
|
|
|
|
|
|
|
my $ken_id; |
636
|
|
|
|
|
|
|
my $city_id; |
637
|
|
|
|
|
|
|
|
638
|
|
|
|
|
|
|
if (defined $address_id) { |
639
|
|
|
|
|
|
|
# print "Found.\n"; |
640
|
|
|
|
|
|
|
$total{found}++; |
641
|
|
|
|
|
|
|
} |
642
|
|
|
|
|
|
|
else { |
643
|
|
|
|
|
|
|
# print "$ken, $city, $address, $values{kanji} Not found.\n"; |
644
|
|
|
|
|
|
|
$ken_id = search_placename_kanji ($o, 'ken', $ken); |
645
|
|
|
|
|
|
|
$city_id = city_search ($o, $city, $ken_id); |
646
|
|
|
|
|
|
|
$address_id = address_insert ($o, $address, '?', $city_id); |
647
|
|
|
|
|
|
|
$total{notfound}++; |
648
|
|
|
|
|
|
|
} |
649
|
|
|
|
|
|
|
my $jigyosyo_id = jigyosyo_insert ($o, $values{kanji}, $values{kana}, |
650
|
|
|
|
|
|
|
$values{street_number}); |
651
|
|
|
|
|
|
|
# next; |
652
|
|
|
|
|
|
|
if ($address_id == 1) { |
653
|
|
|
|
|
|
|
die "BAd aadredd ss id \n"; |
654
|
|
|
|
|
|
|
} |
655
|
|
|
|
|
|
|
jigyosyo_insert_postcode ($o, $values{new_postcode}, |
656
|
|
|
|
|
|
|
$address_id, $jigyosyo_id); |
657
|
|
|
|
|
|
|
} |
658
|
|
|
|
|
|
|
$o->{dbh}->commit (); |
659
|
|
|
|
|
|
|
$o->{dbh}->{AutoCommit} = 1; |
660
|
|
|
|
|
|
|
# print "Found $total{found}: not found $total{notfound}.\n"; |
661
|
|
|
|
|
|
|
} |
662
|
|
|
|
|
|
|
|
663
|
|
|
|
|
|
|
=head2 lookup_jigyosyo |
664
|
|
|
|
|
|
|
|
665
|
|
|
|
|
|
|
my $jigyosyo = lookup_jigyosyo ($jigyosyo_id); |
666
|
|
|
|
|
|
|
|
667
|
|
|
|
|
|
|
Given a jigyosyo id number, return its kanji and kana names and its |
668
|
|
|
|
|
|
|
street number in a hash reference. |
669
|
|
|
|
|
|
|
|
670
|
|
|
|
|
|
|
=cut |
671
|
|
|
|
|
|
|
|
672
|
|
|
|
|
|
|
sub jigyosyo_lookup |
673
|
|
|
|
|
|
|
{ |
674
|
|
|
|
|
|
|
my ($o, $jigyosyo_id) = @_; |
675
|
|
|
|
|
|
|
my %jigyosyo; |
676
|
|
|
|
|
|
|
if (! defined $o->{jigyosyo_lookup_sth}) { |
677
|
|
|
|
|
|
|
my $jigyosyo_lookup_sql = <
|
678
|
|
|
|
|
|
|
select kanji, kana, street_number from jigyosyo |
679
|
|
|
|
|
|
|
where |
680
|
|
|
|
|
|
|
id = ? |
681
|
|
|
|
|
|
|
EOF |
682
|
|
|
|
|
|
|
$o->{jigyosyo_lookup_sth} = $o->{dbh}->prepare ($jigyosyo_lookup_sql); |
683
|
|
|
|
|
|
|
} |
684
|
|
|
|
|
|
|
$o->{jigyosyo_lookup_sth}->execute ($jigyosyo_id); |
685
|
|
|
|
|
|
|
my $r = $o->{jigyosyo_lookup_sth}->fetchall_arrayref (); |
686
|
|
|
|
|
|
|
if (! $r) { |
687
|
|
|
|
|
|
|
return; |
688
|
|
|
|
|
|
|
} |
689
|
|
|
|
|
|
|
if (@$r > 1) { |
690
|
|
|
|
|
|
|
die "Non-unique jigyosyo id number $jigyosyo_id"; |
691
|
|
|
|
|
|
|
} |
692
|
|
|
|
|
|
|
@jigyosyo{qw/kanji kana street_number/} = @{$r->[0]}; |
693
|
|
|
|
|
|
|
return \%jigyosyo; |
694
|
|
|
|
|
|
|
} |
695
|
|
|
|
|
|
|
|
696
|
|
|
|
|
|
|
|
697
|
|
|
|
|
|
|
=head2 lookup_postcode |
698
|
|
|
|
|
|
|
|
699
|
|
|
|
|
|
|
my $addresses = $o->lookup_postcode ('3108610'); |
700
|
|
|
|
|
|
|
print $address->[0]->{ken}->{kanji}, "\n"; |
701
|
|
|
|
|
|
|
# Prints 茨城県 |
702
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
Given a postcode, get the corresponding address details. If the |
704
|
|
|
|
|
|
|
postcode is found, the return value is an array reference containing |
705
|
|
|
|
|
|
|
one or more hash references with the following keys. If the postcode |
706
|
|
|
|
|
|
|
is not found, the return value is the undefined value. |
707
|
|
|
|
|
|
|
|
708
|
|
|
|
|
|
|
=over |
709
|
|
|
|
|
|
|
|
710
|
|
|
|
|
|
|
=item postcode |
711
|
|
|
|
|
|
|
|
712
|
|
|
|
|
|
|
The seven-digit postcode itself, for example 0708033. |
713
|
|
|
|
|
|
|
|
714
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
=item ken_kanji |
716
|
|
|
|
|
|
|
|
717
|
|
|
|
|
|
|
The kanji form of the prefecture name, for example 北海道. |
718
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
|
720
|
|
|
|
|
|
|
=item ken_kana |
721
|
|
|
|
|
|
|
|
722
|
|
|
|
|
|
|
The kana form of the prefecture name, for example ホッカイドウ. |
723
|
|
|
|
|
|
|
|
724
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
=item city_kanji |
726
|
|
|
|
|
|
|
|
727
|
|
|
|
|
|
|
The kanji form of the city name, for example 旭川市. In some instances |
728
|
|
|
|
|
|
|
this data will consist of "gun" and "machi" or "shi" and "ku" |
729
|
|
|
|
|
|
|
information rather than just a city name, depending on the information |
730
|
|
|
|
|
|
|
in the Japan Post Office file itself. |
731
|
|
|
|
|
|
|
|
732
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
=item city_kana |
734
|
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
The kana form of the city name, for example アサヒカワシ. |
736
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
|
738
|
|
|
|
|
|
|
=item address_kanji |
739
|
|
|
|
|
|
|
|
740
|
|
|
|
|
|
|
The final part of the address in kanji, for example 神居町雨紛. |
741
|
|
|
|
|
|
|
|
742
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
=item address_kana |
744
|
|
|
|
|
|
|
|
745
|
|
|
|
|
|
|
The final part of the address in kana, for example カムイチョウウブン. |
746
|
|
|
|
|
|
|
|
747
|
|
|
|
|
|
|
|
748
|
|
|
|
|
|
|
=back |
749
|
|
|
|
|
|
|
|
750
|
|
|
|
|
|
|
If the postcode is a jigyosyo postcode, the result also contains |
751
|
|
|
|
|
|
|
|
752
|
|
|
|
|
|
|
=over |
753
|
|
|
|
|
|
|
|
754
|
|
|
|
|
|
|
=item jigyosyo_kanji |
755
|
|
|
|
|
|
|
|
756
|
|
|
|
|
|
|
The kanji name of the place of business. |
757
|
|
|
|
|
|
|
|
758
|
|
|
|
|
|
|
=item jigyosyo_kana |
759
|
|
|
|
|
|
|
|
760
|
|
|
|
|
|
|
The kana name of the place of business. This, unfortunately, is with |
761
|
|
|
|
|
|
|
small versions of kana all converted into large ones, because this is |
762
|
|
|
|
|
|
|
the format supplied by the post office. |
763
|
|
|
|
|
|
|
|
764
|
|
|
|
|
|
|
=item street_number |
765
|
|
|
|
|
|
|
|
766
|
|
|
|
|
|
|
This is the specific address of the place of business. |
767
|
|
|
|
|
|
|
|
768
|
|
|
|
|
|
|
=back |
769
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
|
771
|
|
|
|
|
|
|
=cut |
772
|
|
|
|
|
|
|
|
773
|
|
|
|
|
|
|
my @fields = qw/ |
774
|
|
|
|
|
|
|
postcode |
775
|
|
|
|
|
|
|
ken_kanji |
776
|
|
|
|
|
|
|
ken_kana |
777
|
|
|
|
|
|
|
city_kanji |
778
|
|
|
|
|
|
|
city_kana |
779
|
|
|
|
|
|
|
address_kanji |
780
|
|
|
|
|
|
|
address_kana jigyosyo_id |
781
|
|
|
|
|
|
|
/; |
782
|
|
|
|
|
|
|
#line 713 "DB.pm.tmpl" |
783
|
|
|
|
|
|
|
|
784
|
|
|
|
|
|
|
sub make_lookup_postcode_sql |
785
|
|
|
|
|
|
|
{ |
786
|
|
|
|
|
|
|
|
787
|
|
|
|
|
|
|
my $sql_fields = join ",", @fields; |
788
|
|
|
|
|
|
|
$sql_fields =~ s/_(kanji|kana)/\.$1/g; |
789
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
my $lookup_postcode_sql = <
|
791
|
|
|
|
|
|
|
select $sql_fields |
792
|
|
|
|
|
|
|
from postcodes, ken, city, address |
793
|
|
|
|
|
|
|
where postcodes.postcode = ? |
794
|
|
|
|
|
|
|
and |
795
|
|
|
|
|
|
|
city.ken_id = ken.id |
796
|
|
|
|
|
|
|
and |
797
|
|
|
|
|
|
|
address.city_id = city.id |
798
|
|
|
|
|
|
|
and |
799
|
|
|
|
|
|
|
postcodes.address_id = address.id |
800
|
|
|
|
|
|
|
EOF |
801
|
|
|
|
|
|
|
return $lookup_postcode_sql; |
802
|
|
|
|
|
|
|
} |
803
|
|
|
|
|
|
|
|
804
|
|
|
|
|
|
|
sub lookup_postcode |
805
|
|
|
|
|
|
|
{ |
806
|
|
|
|
|
|
|
my ($o, $postcode) = @_; |
807
|
|
|
|
|
|
|
if (! $o->{lookup_postcode_sth}) { |
808
|
|
|
|
|
|
|
my $lookup_postcode_sql = make_lookup_postcode_sql (); |
809
|
|
|
|
|
|
|
$o->{lookup_postcode_sth} = $o->{dbh}->prepare ($lookup_postcode_sql); |
810
|
|
|
|
|
|
|
} |
811
|
|
|
|
|
|
|
$o->{lookup_postcode_sth}->execute ($postcode); |
812
|
|
|
|
|
|
|
my $results = $o->{lookup_postcode_sth}->fetchall_arrayref (); |
813
|
|
|
|
|
|
|
if (! $results || @$results == 0) { |
814
|
|
|
|
|
|
|
return; |
815
|
|
|
|
|
|
|
} |
816
|
|
|
|
|
|
|
my @addresses; |
817
|
|
|
|
|
|
|
for my $result (@$results) { |
818
|
|
|
|
|
|
|
my %values; |
819
|
|
|
|
|
|
|
@values{@fields} = @{$result}; |
820
|
|
|
|
|
|
|
if (defined $values{jigyosyo_id}) { |
821
|
|
|
|
|
|
|
my $jigyosyo_values = $o->jigyosyo_lookup ($values{jigyosyo_id}); |
822
|
|
|
|
|
|
|
if ($jigyosyo_values) { |
823
|
|
|
|
|
|
|
$values{jigyosyo_kanji} = $jigyosyo_values->{kanji}; |
824
|
|
|
|
|
|
|
$values{jigyosyo_kana} = $jigyosyo_values->{kana}; |
825
|
|
|
|
|
|
|
$values{street_number} = $jigyosyo_values->{street_number}; |
826
|
|
|
|
|
|
|
} |
827
|
|
|
|
|
|
|
} |
828
|
|
|
|
|
|
|
# Don't leave this in the result, since it is just a database |
829
|
|
|
|
|
|
|
# ID number with no meaning to the user. |
830
|
|
|
|
|
|
|
delete $values{jigyosyo_id}; |
831
|
|
|
|
|
|
|
push @addresses, \%values; |
832
|
|
|
|
|
|
|
} |
833
|
|
|
|
|
|
|
return \@addresses; |
834
|
|
|
|
|
|
|
} |
835
|
|
|
|
|
|
|
|
836
|
|
|
|
|
|
|
=head2 new |
837
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
my $o = Geo::Postcodes::JP::DB->new ( |
839
|
|
|
|
|
|
|
db_file => '/path/to/the/sqlite/database/file', |
840
|
|
|
|
|
|
|
); |
841
|
|
|
|
|
|
|
|
842
|
|
|
|
|
|
|
Create a new database-handling object. See also L to |
843
|
|
|
|
|
|
|
create a database file without data, and L to create |
844
|
|
|
|
|
|
|
the database file and insert its data. |
845
|
|
|
|
|
|
|
|
846
|
|
|
|
|
|
|
=cut |
847
|
|
|
|
|
|
|
|
848
|
|
|
|
|
|
|
sub new |
849
|
|
|
|
|
|
|
{ |
850
|
|
|
|
|
|
|
my ($package, %inputs) = @_; |
851
|
|
|
|
|
|
|
my $o = bless {}; |
852
|
|
|
|
|
|
|
my $db_file = $inputs{db_file}; |
853
|
|
|
|
|
|
|
if ($db_file) { |
854
|
|
|
|
|
|
|
$o->db_connect ($db_file); |
855
|
|
|
|
|
|
|
} |
856
|
|
|
|
|
|
|
return $o; |
857
|
|
|
|
|
|
|
} |
858
|
|
|
|
|
|
|
|
859
|
|
|
|
|
|
|
=head1 FUNCTIONS |
860
|
|
|
|
|
|
|
|
861
|
|
|
|
|
|
|
=head2 create_database |
862
|
|
|
|
|
|
|
|
863
|
|
|
|
|
|
|
my $o = create_database ( |
864
|
|
|
|
|
|
|
db_file => '/path/to/file', |
865
|
|
|
|
|
|
|
); |
866
|
|
|
|
|
|
|
|
867
|
|
|
|
|
|
|
Create the SQLite database specified by C. |
868
|
|
|
|
|
|
|
|
869
|
|
|
|
|
|
|
The return value is a database handling object as returned by L. |
870
|
|
|
|
|
|
|
|
871
|
|
|
|
|
|
|
=cut |
872
|
|
|
|
|
|
|
|
873
|
|
|
|
|
|
|
sub create_database |
874
|
|
|
|
|
|
|
{ |
875
|
|
|
|
|
|
|
my (%inputs) = @_; |
876
|
|
|
|
|
|
|
my $db_file = $inputs{db_file}; |
877
|
|
|
|
|
|
|
if ($inputs{schema_file}) { |
878
|
|
|
|
|
|
|
$schema_file = $inputs{schema_file}; |
879
|
|
|
|
|
|
|
} |
880
|
|
|
|
|
|
|
my $verbose = $inputs{verbose}; |
881
|
|
|
|
|
|
|
if (! $db_file) { |
882
|
|
|
|
|
|
|
croak "Specify the database file"; |
883
|
|
|
|
|
|
|
} |
884
|
|
|
|
|
|
|
if (! $schema_file) { |
885
|
|
|
|
|
|
|
croak "Specify the schema file with schema_file => 'file name'"; |
886
|
|
|
|
|
|
|
} |
887
|
|
|
|
|
|
|
if (-f $db_file) { |
888
|
|
|
|
|
|
|
croak "Database file '$db_file' already exists: not recreating."; |
889
|
|
|
|
|
|
|
} |
890
|
|
|
|
|
|
|
if ($verbose) { |
891
|
|
|
|
|
|
|
print "Making database from schema.\n"; |
892
|
|
|
|
|
|
|
} |
893
|
|
|
|
|
|
|
return make_database_from_schema ($db_file, $schema_file); |
894
|
|
|
|
|
|
|
} |
895
|
|
|
|
|
|
|
|
896
|
|
|
|
|
|
|
=head2 make_database |
897
|
|
|
|
|
|
|
|
898
|
|
|
|
|
|
|
my $o = make_database ( |
899
|
|
|
|
|
|
|
db_file => '/path/to/database/file', |
900
|
|
|
|
|
|
|
postcode_file => '/path/to/postcode/file', |
901
|
|
|
|
|
|
|
); |
902
|
|
|
|
|
|
|
|
903
|
|
|
|
|
|
|
Make the database specified by C from the data in |
904
|
|
|
|
|
|
|
C. The schema is supplied in the |
905
|
|
|
|
|
|
|
F subdirectory of the distribution in the |
906
|
|
|
|
|
|
|
file F. This uses L to create the |
907
|
|
|
|
|
|
|
database and L to insert the data into the |
908
|
|
|
|
|
|
|
database. |
909
|
|
|
|
|
|
|
|
910
|
|
|
|
|
|
|
The return value is the database handling object, as returned by L. |
911
|
|
|
|
|
|
|
|
912
|
|
|
|
|
|
|
=cut |
913
|
|
|
|
|
|
|
|
914
|
|
|
|
|
|
|
sub make_database |
915
|
|
|
|
|
|
|
{ |
916
|
|
|
|
|
|
|
my (%inputs) = @_; |
917
|
|
|
|
|
|
|
my $o = create_database (%inputs); |
918
|
|
|
|
|
|
|
$o->insert_postcode_file (%inputs); |
919
|
|
|
|
|
|
|
return $o; |
920
|
|
|
|
|
|
|
} |
921
|
|
|
|
|
|
|
|
922
|
|
|
|
|
|
|
1; |
923
|
|
|
|
|
|
|
|
924
|
|
|
|
|
|
|
__END__ |