弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

【パナマ文書】csvファイルのデータベースへのロード update8

#パナマ文書 の.csvファイルを普通の人が読むのはちょっと難しい。 行末がOffshore LeaksかPanama Papersをチェックして改行された行をつなげるとか、 先頭のダブルクォートが欠落した行を補完するとか。

$ ls -l offshore_leaks_csvs
total 214860
-rw-rw-r-- 1 hoge hoge  26535755 May  9 15:42 Addresses.csv
-rw-rw-r-- 1 hoge hoge  39388834 May  9 18:16 all_edges.csv
-rw-rw-r-- 1 hoge hoge 106940060 May  9 15:42 Entities.csv
-rw-rw-r-- 1 hoge hoge   3668297 May  9 15:42 Intermediaries.csv
-rw-rw-r-- 1 hoge hoge  43467573 May  9 15:42 Officers.csv
$

この.csvファイルにはクセがあって(一部壊れてる)とこがあって 簡単にはデータベースにロードすることはできない。

改行コードはWindowsのCR/LFになっている。Perlで処理するにはdos2unixでLFへの変換が必要。

改行されている行をつなげるスクリプトw

#!/usr/bin/perl

my $h = scalar(<>);
print $h;

my $last_line;
while (<>) {
                chomp;
                my $line = $_;
                # ,Offshore Leaks,Panama Papers
                if ($line =~ /,Offshore Leaks/ || $line =~ /,Panama Papers/) {
                        print $last_line . $line . "\n";
                        $last_line = "";
                }
                else {
                        $last_line = $line;
                }
}

先頭のダブルクォート「"」が欠落した行を補完する。

#!/usr/bin/perl

use strict;

$| = 1;

use Text::CSV;

my $h = scalar(<>);
print $h;
chomp($h);
my @colname = split(/,/, $h);

my $pp = Text::CSV->new({ allow_whitespace => 1, binary => 1 });

while(<>) {
        chomp;
        my $line = $_;
        $pp->parse($line);
        my @fs = $pp->fields($line);
        if ($#fs != $#colname) {
                print "\"" . $line . "\n";
        } else {
                print $line . "\n";
        }
}

# End of FILE.

.csvファイルの先頭行のラベルと行の最大長を調べて表定義を生成。

#!/usr/bin/perl

use strict;

$| = 1;

use Text::CSV;

my $h = scalar(<>);
print $h . "\n";

chomp($h);
my @colname = split(/,/, $h);
for (my $loop = 0; $loop <= $#colname; $loop++) {
        print STDERR "$loop $colname[$loop]\n";
}

my $MAX_COLS=$#colname + 1;
print "MAX_COLS $MAX_COLS\n";

my @COL_LEN;
my @COL_TYPE;
my @COL_NULL;

#my $pp = Text::CSV->new();
my $pp = Text::CSV->new({ allow_whitespace => 1, binary => 1 });

while(<>) {
        chomp;
        my $line = $_;
        $pp->parse($line);
        my @fs = $pp->fields($line);
        if ($#fs != $#colname) {
                print "[" . $#fs . "]" . $line . "\n"
                #print "\"" . $line . "\n"
        } else {
                #print $line . "\n"
        }
        #print $#fs . "\n";
        #exit(3);
        &column_type(@fs);
}

for (my $loop = 0; $loop <= $#colname; $loop++) {
        #print "$loop $colname[$loop] len $COL_LEN[$loop] type $COL_TYPE[$loop]\n";
        if ($COL_TYPE[$loop] eq "d" ) {
                if ($COL_NULL[$loop] eq "null") {
                        print "$colname[$loop] integer,\n";
                } else {
                        print "$colname[$loop] integer not null,\n";
                }
        } else {
                if ($COL_NULL[$loop] eq "null") {
                        print $colname[$loop] . " varchar(" . $COL_LEN[$loop] . "),\n";
                } else {
                        print $colname[$loop] . " varchar(" . $COL_LEN[$loop] . ") not null,\n";
                }
        }
}

sub column_type {
        my (@fs) = @_;
        for (my $loop = 0; $loop <= $#colname; $loop++) {
                if ($COL_LEN[$loop] < length($fs[$loop])) {
                        $COL_LEN[$loop] = length($fs[$loop]);
                }
                if ($fs[$loop] ne "" && $fs[$loop] =~ /^\d+$/) {
                        $COL_TYPE[$loop] = "d";
                } else {
                        $COL_TYPE[$loop] = "s";
                }
                if ($fs[$loop] eq "") {
                        $COL_NULL[$loop] = "null";
                }
        }

}

# End of FILE.
ちょっとバグあるかも。

とりあえずな表定義。

/*
==> Addresses.csv <==
address,icij_id,valid_until,country_codes,countries,node_id,sourceID
*/
create table panama_addresses (
        address varchar(800) not null,
        icij_id varchar(48),
        valid_until varchar(48) not null,
        country_codes varchar(5),
        countries varchar(48),
        node_id integer not null,
        sourceID varchar(20) not null,
        primary key (node_id)
);
create index panama_addresses_node_id_idx on panama_addresses(node_id);

/*
==> all_edges.csv <==
node_1,rel_type,node_2
*/

drop table panama_all_edges;
create table panama_all_edges (
    node_1         integer not null,
    rel_type       varchar(20),
    node_2         integer
);
create index panama_all_edges_node_1_idx on panama_all_edges(node_1);
create index panama_all_edges_node_2_idx on panama_all_edges(node_2);

/*
==> Entities.csv <==
name,original_name,former_name,jurisdiction,jurisdiction_description,company_type,address,internal_id,incorporation_date,inactivation_date,struck_off_date,dorm_date,status,service_provider,ibcRUC,country_codes,countries,note,valid_until,node_id,sourceID
*/

create table panama_entities (
name varchar(200),
original_name varchar(200),
former_name varchar(200),
jurisdiction varchar(10) not null,
jurisdiction_description varchar(48) not null,
company_type varchar(48),
address varchar(300),
internal_id integer,
incorporation_date varchar(20),
inactivation_date varchar(20),
struck_off_date varchar(20),
dorm_date varchar(20),
status varchar(48),
service_provider varchar(48) not null,
ibcRUC varchar(20),
country_codes varchar(20),
countries varchar(80),
note varchar(256),
valid_until varchar(52) not null,
node_id integer not null,
sourceID varchar(20) not null
);
create index panama_entities_node_id_idx on panama_entities(node_id);

/*
==> Intermediaries.csv <==
name,internal_id,address,valid_until,country_codes,countries,status,node_id,sourceID
*/

drop table panama_intermediaries;
create table panama_intermediaries (
name varchar(100),
internal_id varchar(20),
address varchar(256),
valid_until varchar(48) not null,
country_codes varchar(20),
countries varchar(80),
status varchar(48),
node_id integer not null,
sourceID varchar(20) not null
);
create index panama_intermediaries_node_id_idx on panama_intermediaries(node_id);

/*
==> Officers.csv <==
name,icij_id,valid_until,country_codes,countries,node_id,sourceID
*/

drop table panama_officers;
create table panama_officers (
        name varchar(256),
        icij_id varchar(48),
        valid_until varchar(48) not null,
        country_codes varchar(200),
        countries varchar(400),
        node_id integer not null,
        sourceID varchar(20) not null
);
create index panama_officers_node_id_idx on panama_officers(node_id);

#!/usr/bin/perl

use strict;
use utf8;
use strict;
use Encode;
use DBD::Pg;

my $dbh;
my $sth;

$dbh = DBI->connect("dbi:Pg:dbname=icijdb;host=localhost", "hoge", "hogehoge");
$dbh->{pg_enable_utf8} = 1;

$| = 1;

use Text::CSV;

my $h = scalar(<>);
print $h . "\n";

chomp($h);
my @colname = split(/,/, $h);
for (my $loop = 0; $loop <= $#colname; $loop++) {
        print STDERR "$loop $colname[$loop]\n";
}

my $MAX_COLS=$#colname + 1;
print "MAX_COLS $MAX_COLS\n";

my @COL_LEN;
my @COL_TYPE;
my @COL_NULL;

my $pp = Text::CSV->new({ allow_whitespace => 1, binary => 1 });

while(<>) {
        chomp;
        my $line = $_;
        $pp->parse($line);
        my @fs = $pp->fields($line);
        #&insert_panama("panama_addresses", @fs);
        #&insert_panama("panama_all_edges", @fs);
        #&insert_panama("panama_entities", @fs);
        #&insert_panama("panama_intermediaries", @fs);
        &insert_panama("panama_officers", @fs);
}

$dbh->disconnect;

sub insert_panama {
        my ($tn, @fs) = @_;
        my $sql = "INSERT INTO " . $tn . " (";
        for (my $loop = 0; $loop <= $#colname; $loop++) {
                $sql .= $colname[$loop];
                $sql .= ", " if ($loop < $#colname);
        }
        $sql .= ") values (";
        for (my $loop = 0; $loop <= $#colname; $loop++) {
            $fs[$loop] =~ s/\"//g;
            $fs[$loop] =~ s/\\//g;
            $fs[$loop] =~ s/\'/\'\'/g;
            $fs[$loop] =~ tr/ / /s;
            $fs[$loop] =~ s/ $//;
                if ($fs[$loop] eq "") {
                        $sql .= 'null';
                } else {
                        $sql .= 'E\'' . $fs[$loop] . '\'';
                }
                $sql .= ", " if ($loop < $#colname);
        }
        $sql .= ")";
        #print $sql . "\n";
        $sth = $dbh->prepare($sql);
        $sth->execute() or print "[$sql]\n";
}

# End of FILE.

.csvファイルで、2014年オフショア・リークスに2016年5月10日のパナマ文書がマージされてるのを 電通とJALで検証は終わっているw

この.csvファイルのデータ構造は 「たつる」と「けん」を使い分けていたJALの「深谷 建」で理解してくれw

icijdb=> select node_id,address from panama_addresses where country_codes = 'JPN' and address like '%???%';
 node_id |       address
---------+---------------------
  288993 | ????????1-4-2
  267284 | ???????????1115??-2
  287985 | ???????????1-21-2
(3 rows)

icijdb=>
今回のリリースて、日本語の住所がつぶれてる。
nodesNW.csv:"288993";"ADDRESS";"川崎市麻生区向原1-4-2";"川崎市麻生区向原1-4-2 ";"";"";"";"";"";"";"";"";"";"";"";""
nodesNW.csv:"267284";"ADDRESS";"日本靜岡縣富士宮市山宮1115番地-2";"日本靜岡縣富士宮市山宮1115番地-2 ";"";"";"";"";"";"";"";"";"";"";"";""
nodesNW.csv:"287985";"ADDRESS";"日本国東京都品川区大井1-21-2";"日本国東京都品川区大井1-21-2 ";"";"";"";"";"";"";"";"";"";"";"";""
でも、前回のリリース(2014年1月23日のオフショアリーク)から補完できますけど。やっぱ中国人じゃないとダメなんじゃね。

update panama_addresses set address = '川崎市麻生区向原1-4-2' where node_id = 288993;
update panama_addresses set address = '日本靜岡縣富士宮市山宮1115番地-2' where node_id = 267284;
update panama_addresses set address = '日本国東京都品川区大井1-21-2' where node_id = 287985;
なおしちゃうけどね。
icijdb=> select node_id,address from panama_addresses where node_id = 288993 or node_id = 267284 or node_id = 287985;
 node_id |             address
---------+----------------------------------
  288993 | 川崎市麻生区向原1-4-2
  267284 | 日本靜岡縣富士宮市山宮1115番地-2
  287985 | 日本国東京都品川区大井1-21-2
(3 rows)

icijdb=>

#!/usr/bin/perl

use utf8;
use strict;
use Encode;
use DBD::Pg;

my $dbh;
my $sth;

my $TARGET=$ARGV[0];

$dbh = DBI->connect("dbi:Pg:dbname=icijdb;host=localhost", "hoge", "hogehoge");
$dbh->{pg_enable_utf8} = 1;

$| = 1;

my $sql = "select node_id, address, countries, sourceid \
from panama_addresses where country_codes like '%JPN%'";
#from panama_addresses where country_codes like '%JPN%' and sourceid = 'Panama Papers'";
#from panama_addresses where country_codes like '%JPN%' and node_id = 106210";
#from panama_addresses where country_codes like '%JPN%' and node_id = 10041189";

#my $sql = "select node_id, name, sourceid \
#from panama_entities where name ilike 'JAL %'";

my $d = $dbh->selectall_arrayref($sql);

my @did;

if ($TARGET ne "") {
	&decode_edges(0, $TARGET, \@did);
	exit(0);
}

foreach my $r (@$d) {
	print "ENTITY NAME(" . $r->[1] . ")...\n";
	&decode_edges(0, $r->[0], \@did);
	print "ENTITY NAME(" . $r->[1] . ").\n";
	@did = ();
}
exit(0);


#&decode_edges(0, 237160, \@did);

#Officers_join_quote.csv:MAKOTO LIDA,C97034016EB8D9610783505476E09702,The Panama Papers data is current through 2015,JPN,Japan,12110253,Panama Papers
#Officers_join_quote.csv:MAKOTO LIDA,6DABC577023B120E1DDE4B77AC20542B,The Panama Papers data is current through 2015,JPN,Japan,12113193,Panama Papers
#&decode_edges(0, 12110253, \@did); @did = ();
#&decode_edges(0, 12113193, \@did); @did = ();

#&decode_edges(0, 12128826, \@did);@did = ();
#&decode_edges(0, 123878, \@did);@did = ();

# Dentsu
#&decode_edges(0, 264364, \@did);@did = ();
#&decode_edges(0, 301852, "");
#&decode_edges(0, 521853, "");
#&decode_edges(0, 228428, "");
#&decode_edges(0, 228428, "");
#&decode_edges(0, 10043130, \@did);@did = ();
#&decode_edges(0, 11000398, \@did);@did = ();

# NHK Global
#&decode_edges(0, 10041189, \@did);@did = ();
#&decode_edges(0, 11012361, \@did);@did = ();
#
#&decode_edges(0, 11012361, "");
#&decode_edges(0, 10208219, "");
#&decode_edges(0, 10211988, "");
#&decode_edges(0, 10200933, "");
#&decode_edges(0, 10202060, "");
#&decode_edges(0, 10194896, "");
#&decode_edges(0, 10192849, "");
#&decode_edges(0, 10192821, "");
#&decode_edges(0, 10195526, "");

#print &decode_address(106210) . "\n";
#print &decode_officer(116979) . "\n";
#print &decode_entity(167528) . "\n";
#print &decode_intermediaries(292366, "") . "\n";
#&decode_edges(0, 106210, "");

sub decode_edges() {
	my ($nest, $node_id, $did) = @_;
	my $sql = "select node_1, rel_type, node_2 from panama_all_edges where node_1 = $node_id or node_2 = $node_id";

	my $nest_s = "";
	for (my $loop = 0; $loop < $nest; $loop++) {
		#print ".";
		$nest_s .= ".";
	}

	for (my $loop = 0; $loop <= $#$did; $loop++) {
		if (@$did[$loop] == $node_id) {
			#print $nest_s . " $node_id o\n";
			return;
		}
	}

	push (@$did, $node_id);

	if ($nest > 10) {
		#print $nest_s . " $node_id x\n";
		return;
	}

	my $e = $dbh->selectall_arrayref($sql);
	foreach my $r (@$e) {
		#print $r->[0] . "/" . $r->[1] . "/" . $r->[2] . " ";
		if ($r->[1] eq "registered_address") {
			my $address2;
			$address2 = &decode_address($r->[2]) if ($r->[0] == $node_id);
			print "$nest_s$address2\n" if ($address2 ne "");
			&decode_edges($nest + 1,$r->[0], $did) if ($r->[2] == $node_id);
		}
		elsif ($r->[1] eq "officer_of") {
			my $officer;
			$officer = &decode_officer($r->[0]) if ($r->[2] == $node_id);
			$officer .= &decode_entity($r->[2]);
			print "$nest_s$officer\n" if ($officer ne "");
			&decode_edges($nest + 1,$r->[2], $did) if ($r->[0] == $node_id);
		}
		elsif ($r->[1] eq "intermediary_of") {
			my $intermediary;
			$intermediary = &decode_intermediaries($r->[0]) if ($r->[2] == $node_id);
			$intermediary .= &decode_entity($r->[2]);
			print "$nest_s$intermediary\n" if ($intermediary ne "");
			&decode_edges($nest + 1,$r->[2], $did) if ($r->[0] == $node_id);
		}
		elsif ($r->[1] eq "similar") {
			print $nest_s . $r->[0] . "/" . $r->[1] . "/" . $r->[2] . "\n";
			my $similar;
			$similar = &decode_officer($r->[0]) if ($r->[2] == $node_id);
			$similar = &decode_officer($r->[2]) if ($r->[0] == $node_id);
			$similar .= &decode_entity($r->[2]);
			print $nest_s . "= " . "$similar\n" if ($similar ne "");
			&decode_edges($nest + 1,$r->[2], $did) if ($r->[0] == $node_id);
		}
		else {
			print $r->[0] . "/" . $r->[1] . "/" . $r->[2];
			print $nest_s . "N/A\n";
		}
	}
}

sub decode_address() {
	my ($node_id) = @_;
	#print  "ADDRESS(" . $node_id . ")"  . " -> ";

	my $sql = "select node_id, address, countries, sourceid \
from panama_addresses where node_id = $node_id";

	my $d = $dbh->selectall_arrayref($sql);

	my $address = "";
	foreach my $r (@$d) {
		$address = "ADDRESS(" . $r->[0] . ")[" . $r->[1] . "/" . $r->[2] . "/" . $r->[3] . "]";
		#print encode('UTF-8', $address) . " -> ";
	}
	$address;
}

sub decode_officer() {
	my ($node_id) = @_;
	#print  "OFFICER(" . $node_id . ") -> ";

	my $sql = "select node_id, name, countries, sourceid \
from panama_officers where node_id = $node_id";

	my $d = $dbh->selectall_arrayref($sql);

	my $officer = "";
	foreach my $r (@$d) {
		$officer = "OFFICER(" . $r->[0] . ")[" . $r->[1] . "/" . $r->[2] . "/" . $r->[3] . "]";
		#print  encode('UTF-8', $officer) . " -> ";
	}
	$officer;
}

sub decode_intermediaries() {
	my ($node_id) = @_;
	#print  "OFFICER(" . $node_id . ") -> ";

	my $sql = "select node_id, name, countries, sourceid \
from panama_intermediaries where node_id = $node_id";

	my $d = $dbh->selectall_arrayref($sql);

	my $officer = "";
	foreach my $r (@$d) {
		$officer = "INTERMEDIARIES(" . $r->[0] . ")[" . $r->[1] . "/" . $r->[2] . "/" . $r->[3] . "]";
		#print  encode('UTF-8', $officer) . " -> ";
	}
	$officer;
}

sub decode_entity() {
	my ($node_id) = @_;

	my $sql = "select node_id, name, countries, sourceid \
from panama_entities where node_id = $node_id";

	my $d = $dbh->selectall_arrayref($sql);

	my $officer = "";
	foreach my $r (@$d) {
		$officer = "ENTITY(" . $r->[0] . ")[" . $r->[1] . "/" . $r->[2] . "/" . $r->[3] . "]";
		#print  encode('UTF-8', $officer) . " -> ";
	}
	$officer;
}

$dbh->disconnect;
今回のデータ構造はおもろい。再帰的なロジック使ったり。

JALのおっさんの住所コード(106210)だけを抽出するように

my $sql = "select node_id, address, countries, sourceid \
from panama_addresses where country_codes like '%JPN%' and node_id = 106210";
に設定して実行するとこんな。
$ perl panama_extract.pl
ADDRESS(106210)
 ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  INTERMEDIARIES(292366)[Jones Day/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(90504)[Koji Kikuchi/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(98050)[Atsuo Shimada/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(115967)[Uichiro Naito/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(118344)[Ko Shinkai/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(116979)[Tatsuru Fukaya/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(116648)[Jones, Day, Reavis & Pogue, Tokyo/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(43026)[Koreto Ogata/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(48066)[Fumio Koizumi/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(47575)[Kokichi Nakayama/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(47981)[JAL Leasing Co., Ltd/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(47117)[Yoshihiko Furuta/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(49616)[Secorp Limited/Cook Islands;Singapore;Switzerland/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(2001407)[Bearer 1/Not identified/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(55197)[Shigeo Matsui/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(56917)[Trustcorp Limited/United States;Singapore;Japan;Virgin Islands, British;United Kingdom;Hong Kong;Not identified;Thailand;Cook Islands/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
  OFFICER(70895)[Masayuki Endo/Japan/Offshore Leaks]ENTITY(167528)[JAL Leasing (Cook) Co., Ltd/Not identified/Offshore Leaks]
 ADDRESS(106210)[5-7-17, Minami-karasuyama Satagaya-ku Tokyo Japan/Japan/Offshore Leaks]
$

データレコードの最後にOffshore Leaks、Panama Papersの印が付いていたので、今回追加されたパナマ文書で住所コードが'%JPN%'のものだけを展開。
20160512_panama_papers_jp_new_record.zip
201650513_panama_papers_jp_new_record_similar.zip

「CANNON ASSET MANAGEMENT LIMITED」なる会社が登場。 でもキャノンてCANONじゃなかったか?

再帰的な検索でループが発生してしまうよーなので、一度チェックした$node_idを覚えておき、二度めは検索しない判断を追加。

20160516_panama_papers_jpn.zip

NISSENが追加されているのを発見。

ENTITY NAME(2; B; 50; 3 Matsubara Soka City; Saitama Prefecture; JAPAN)...
.ENTITY(10105123)[NISSEN INTERNATIONAL INC./Hong Kong/Panama Papers]
..INTERMEDIARIES(11001746)[ORION HOUSE SERVICES (HK) LIMITED/Hong Kong/Panama Papers]ENTITY(10105123)[NISSEN INTERNATIONAL INC./Hong Kong/Panama Papers]
..OFFICER(12207862)[LIU HONG FENG/China/Panama Papers]ENTITY(10105123)[NISSEN INTERNATIONAL INC./Hong Kong/Panama Papers]
..OFFICER(13000039)[LIU HONG FENG/China/Panama Papers]ENTITY(10105123)[NISSEN INTERNATIONAL INC./Hong Kong/Panama Papers]
.ADDRESS(14011862)[2; B; 50; 3 Matsubara Soka City; Saitama Prefecture; JAPAN/Japan/Panama Papers]
.12207862/similar/13000039
.= OFFICER(13000039)[LIU HONG FENG/China/Panama Papers]
..ENTITY(10105123)[NISSEN INTERNATIONAL INC./Hong Kong/Panama Papers]
..ADDRESS(14011862)[2; B; 50; 3 Matsubara Soka City; Saitama Prefecture; JAPAN/Japan/Panama Papers]
..12207862/similar/13000039
..= OFFICER(12207862)[LIU HONG FENG/China/Panama Papers]
ENTITY NAME(2; B; 50; 3 Matsubara Soka City; Saitama Prefecture; JAPAN).

NISSENなのに松原団地の住所w

あ、 #パナマ文書 の住所にボロい都営住宅がでてくるのだけど、これって贈収賄に使う場所なんだわw
あべちんGJ

投稿されたコメント:

コメント
コメントは無効になっています。