ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-09-07

[][][]リファレンスを使ってデータを構造化する 21:06 リファレンスを使ってデータを構造化する - ishiducaの日記 を含むブックマーク はてなブックマーク - リファレンスを使ってデータを構造化する - ishiducaの日記 リファレンスを使ってデータを構造化する - ishiducaの日記 のブックマークコメント

カテゴリー、摘要、金額の順にスペースで区切られたファイル(data.txt)を読み込み、構造的なハッシュテーブルを作ります。

data.txt

その他    両替手数料                     100
移動費    乗車券(直江津〜東京都区内)    4840
移動費    特急指定券(直江津〜越後湯沢)  1220
移動費    新幹線自由券(越後湯沢〜東京)  2720
飲料      水(2l)                         178
菓子      ベビースター                   118
食事      四川風麻婆豆腐丼               450
駐車      駐車料金                       300
食事      寿司食べ放題+飲み放題         5000
宿泊      宿泊費                        4800
宅配便    宅配便の箱                     300
宅配便    送料                          1200
食事      親子丼                         470
移動費    乗車券(東京駅構内〜高田)      4840
移動費    新幹線自由席(東京〜越後湯沢)  2720
移動費    特急指定席(越後湯沢〜高田)    1120
飲料      アイスカフェラテ               300
デザート  ラムレーズンのアイス           300

ハッシュ(%ls)のキーはカテゴリー(その他、移動費など)、値は摘要と金額で構成された配列を値とした配列とします。...と言ってもわかりにくいので、先にハッシュテーブルを見ましょう。今回書いたスクリプト(dump.pl)を実行すると表示されます。

$VAR1 = {
          'デザート' => [
                              [
                                'ラムレーズンのアイス', '300'
                              ]
                            ],
          '食事' => [
                        [
                          '四川風麻婆豆腐丼', '450'
                        ],
                        [
                          '寿司食べ放題+飲み放題', '5000'
                        ],
                        [
                          '親子丼', '470'
                        ]
                      ],
          'その他' => [
                           [
                             '両替手数料','100'
                           ]
                         ],
          '菓子' => [
                        [
                          'ベビースター', '118'
                        ]
                      ],
          '飲料' => [
                        [
                          '水(2l)','178'
                        ],
                        [
                          'アイスカフェラテ','300'
                        ]
                      ],
          '移動費' => [
                           [
                             '乗車券(直江津〜東京都区内)','4840'
                           ],
                           [
                             '特急指定券(直江津〜越後湯沢)','1220'
                           ],
                           [
                             '新幹線自由券(越後湯沢〜東京)', '2720'
                           ],
                           [
                             '乗車券(東京駅構内〜高田)','4840'
                           ],
                           [
                             '新幹線自由席(東京〜越後湯沢)','2720'
                           ],
                           [
                             '特急指定席(越後湯沢〜高田)','1120'
                           ]
                         ],
          '駐車' => [
                        [
                          '駐車料金', '300'
                        ]
                      ],
          '宿泊' => [
                        [
                          '宿泊費', '4800'
                        ]
                      ],
          '宅配便' => [
                           [
                             '宅配便の箱', '300'
                           ],
                           [
                             '送料','1200'
                           ]
                         ]
        };

dump.pl

#!/usr/bin/perl -wnlaF'\s+'
use strict;
use Data::Dumper;

our(%ls);
BEGIN{
    $ARGV[0] = 'data.txt';
}

my $category = shift @F;
# exists $ls{$category} or $ls{$category} = [];
push @{$ls{$category}}, [@F];

END{
    print Dumper(\%ls);
    exit 0;
}

今回はデータ構造を見るだけでしたが、これで応用の効くデータ構造ができました

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090907