このノートでは、オープンデータ流通推進コンソーシアム が提案する CSV データに項目名や単位、データ全体の見出しなどを付与する規格である 「オープンデータ化のための CSV 形式データ規格」 (PDF) にもとづいて、CSV データを甲州記法に変換するプログラムをつくります。
データセット全体に対する情報として、
見出し、作成者、作成日、言語の 4 つがあります。
日付の形式は ISO 8601:2004 に、
言語の記号は ISO 639-1:2002 にしたがいます。
これらの情報を、つぎのような先頭に @
がついた形式の
CSV データであらわします。
@Caption,都道府県別人口と人口増加率,ja,,,,,,
@Creator,総務省統計局,ja,,,,,,
@Date,2010-10-01,,,,,,,
@Language,ja,,,,,,,
各項目に関する情報として、項目名、データ型、単位、記数単位があります。
データ型として XML Schema Part 2 で定義された名前を使います。
こちらは、先頭に @@
がついた形式の CSV データであらわします。
表計算ソフトなどでデータを表示したとき、データの内容と同じ列になるように、
@@
のつぎの行に記載します。
@@Title,ja,,,,,,,
都道府県,2000年の人口,2005年の人口,2005年の人口集中地区の人口, ...
@@Datatype,,,,,,,,
string,integer,integer,integer,double,integer,double, ...
@@Unit,ja,,,,,,,
,,,,%,,,/km2,%
@@Baseval,,,,,,,,
,1000,1000,1000,,1000,,,
ここでの例は、日本の統計 第 2 章 人口・世帯 の 2-2「都道府県別人口と人口増減率」から抜粋したものです。
都道府県 | 2000 | 2005 | 集中地区 | 増減率 1 | 2010 | 人口性比 | 人口密度 | 増減率 2 |
---|---|---|---|---|---|---|---|---|
北海道 | 5683 | 5628 | 4108 | -1.0 | 5506 | 89.7 | 70.2 | -2.2 |
青森 | 1476 | 1437 | 653 | -2.6 | 1373 | 88.9 | 142.4 | -4.4 |
岩手 | 1416 | 1385 | 407 | -2.2 | 1330 | 91.3 | 87.1 | -4.0 |
宮城 | 2365 | 2360 | 1371 | -0.2 | 2348 | 94.3 | 322.3 | -0.5 |
秋田 | 1189 | 1146 | 386 | -3.7 | 1086 | 88.5 | 93.3 | -5.2 |
都道府県ごとの人口として、2000 年、2005 年、2010 年の数値があり、 2000 年から 2005 年、および、2005 年から 2010 年の人口増減率が計算されます。 2005 年は人口集中地区の人口という項目があり、 2010 年は 女性 / 男性 の人口性比と、人口密度があります。 これが、つぎのような CSV データで表現されます。
北海道,5683,5628,4108,-1.0,5506,89.7,70.2,-2.2
青森,1476,1437,653,-2.6,1373,88.9,142.4,-4.4
岩手,1416,1385,407,-2.2,1330,91.3,87.1,-4.0
宮城,2365,2360,1371,-0.2,2348,94.3,322.3,-0.5
秋田,1189,1146,386,-3.7,1086,88.5,93.3,-5.2
変換対象とするデータを CSV データ (comma-seperated values)
A,B,C
に限らず、タブ区切り A →B →C
( →
はタブ)、
棒区切り A|B|C
、セミコロン区切り A;B;C
なども含むように、
XSV (X-seperated values) とよぶことにします。
XSV データの見出しと本体を、つぎの 6 つの判断種のデータに変換します。
判断種 | 用途 |
---|---|
XSV-DOC | データ全体に言及する情報 |
XSV-TERM | 位置 /pos が名前 /term の項目であること |
XSV-DATATYPE | 項目 /term のデータ型 /datatype |
XSV-UNIT | 項目 /term の単位 /unit |
XSV-BASEVAL | 項目 /term の記数単位 /baseval |
XSV | 各行のデータ |
上に引用した「都道府県別人口と人口増加率」の CSV ファイル
POPULATION.csv
を対象として、
甲州記法への変換コマンド
$ koshu-env.sh ./unxsv.hs < POPULATION.csv > POPULATION.k
を実行すると、つぎような内容のファイル POPULATION.k
に出力されます。
|-- XSV-DOC /caption '都道府県別人口と人口増加率
/creator '総務省統計局
/date '2010-10-01
/language 'ja
|-- XSV-TERM /pos 1 /term '都道府県
|-- XSV-TERM /pos 2 /term '2000年の人口
...
|-- XSV-DATATYPE /term '都道府県 /datatype 'string
|-- XSV-DATATYPE /term '2000年の人口 /datatype 'integer
...
|-- XSV-UNIT /term '2000年から2005年の人口増減率 /unit "%"
|-- XSV-UNIT /term '2010年の人口密度 /unit "/km2"
|-- XSV-UNIT /term '2005年から2010年の人口増減率 /unit "%"
|-- XSV-BASEVAL /term '2000年の人口 /baseval 1000
|-- XSV-BASEVAL /term '2005年の人口 /baseval 1000
...
|-- XSV /都道府県 '北海道 /2000年の人口 5683 /2005年の人口 5628
/2005年の人口集中地区の人口 4108 /2000年から2005年の人口増減率 -1.0
/2010年の人口 5506 /2010年の人口性比 89.7
/2010年の人口密度 70.2 /2005年から2010年の人口増減率 -2.2
|-- XSV /都道府県 '青森 /2000年の人口 1476 /2005年の人口 1437
/2005年の人口集中地区の人口 653 /2000年から2005年の人口増減率 -2.6
/2010年の人口 1373 /2010年の人口性比 88.9
/2010年の人口密度 142.4 /2005年から2010年の人口増減率 -4.4
...
甲州記法に変換されたデータは、関係代数にもとづいて、追加の計算を実行できます。 たとえば、つぎのコマンド
$ koshu POPULATION.k to-year-pop.k > YEAR-POP.k
で to-year-pop.k
により変換し、
/年
/都道府県
/人口
の項目だけをもつように正規化されたデータ
YEAR-POP.k
を作成できます。
|-- 都道府県人口 /年 2010 /都道府県 '北海道 /人口 5506
|-- 都道府県人口 /年 2010 /都道府県 '青森 /人口 1373
|-- 都道府県人口 /年 2010 /都道府県 '岩手 /人口 1330
...
|-- 全国人口 /年 2000 /人口 126926
...