@nqounetです。
新シリーズ「Mooを使ってデータエクスポーターを作ってみよう」を始めます!
このシリーズでは、アドレス帳のデータを様々な形式(CSV、JSON、YAMLなど)で出力できる「データエクスポーター」を作っていきます。
最初はシンプルな実装から始めて、少しずつ改良を加えながら、より良い設計へと進化させていきましょう。
今回作るもの
アドレス帳のデータを持っていて、これをCSVファイルやJSONファイルで保存したいと思います。
保存形式は実行時に選べるようにしたいです。
まずは素朴に「if/elseで形式を切り替える」という実装をしてみましょう。
flowchart LR
A[アドレス帳データ] --> B{形式を選択}
B -->|csv| C[CSV形式で出力]
B -->|json| D[JSON形式で出力]
アドレス帳データを用意する
まずはエクスポートするデータを用意します。今回は3人分のシンプルなアドレス帳データを使います。
1
2
3
4
5
6
7
| use v5.36;
my @contacts = (
{ name => '田中太郎', email => 'tanaka@example.com', phone => '090-1234-5678' },
{ name => '鈴木花子', email => 'suzuki@example.com', phone => '080-2345-6789' },
{ name => '佐藤次郎', email => 'sato@example.com', phone => '070-3456-7890' },
);
|
このデータをCSV形式とJSON形式の両方で出力できるようにします。
if/elseで形式を切り替える
出力形式を引数で受け取り、if/elseで処理を分岐させます。
flowchart TD
A[開始] --> B[形式を取得]
B --> C{format は csv?}
C -->|Yes| D[CSV形式で出力]
C -->|No| E{format は json?}
E -->|Yes| F[JSON形式で出力]
E -->|No| G[エラー: 未対応の形式]
D --> H[終了]
F --> H
G --> H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| #!/usr/bin/env perl
use v5.36;
use JSON::PP;
# アドレス帳データ
my @contacts = (
{ name => '田中太郎', email => 'tanaka@example.com', phone => '090-1234-5678' },
{ name => '鈴木花子', email => 'suzuki@example.com', phone => '080-2345-6789' },
{ name => '佐藤次郎', email => 'sato@example.com', phone => '070-3456-7890' },
);
# コマンドライン引数から形式を取得(デフォルトはcsv)
my $format = $ARGV[0] // 'csv';
# 形式に応じて出力を切り替え
if ($format eq 'csv') {
# CSV形式で出力
say "name,email,phone";
for my $contact (@contacts) {
say "$contact->{name},$contact->{email},$contact->{phone}";
}
}
elsif ($format eq 'json') {
# JSON形式で出力
my $json = JSON::PP->new->pretty->encode(\@contacts);
print $json;
}
else {
die "未対応の形式です: $format\n";
}
|
実行してみよう
このスクリプトをexporter.plとして保存し、実行してみましょう。
CSV形式で出力する場合:
出力結果:
1
2
3
4
| name,email,phone
田中太郎,tanaka@example.com,090-1234-5678
鈴木花子,suzuki@example.com,080-2345-6789
佐藤次郎,sato@example.com,070-3456-7890
|
JSON形式で出力する場合:
出力結果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [
{
"email" : "tanaka@example.com",
"name" : "田中太郎",
"phone" : "090-1234-5678"
},
{
"email" : "suzuki@example.com",
"name" : "鈴木花子",
"phone" : "080-2345-6789"
},
{
"email" : "sato@example.com",
"name" : "佐藤次郎",
"phone" : "070-3456-7890"
}
]
|
うまく動きましたね!
今回のポイント
今回は、if/elseを使ってCSVとJSONの2つの形式を切り替える実装をしました。
if/else文は、条件に応じて処理を分岐させる基本的な構文です。今回は$formatの値に応じて、CSV出力とJSON出力を切り替えています。
この方法はシンプルでわかりやすいですが、形式が増えるとどうなるでしょうか?
次回は、YAML形式やXML形式を追加したときに何が起こるか見ていきましょう。
今回の完成コード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| #!/usr/bin/env perl
use v5.36;
use JSON::PP;
# アドレス帳データ
my @contacts = (
{ name => '田中太郎', email => 'tanaka@example.com', phone => '090-1234-5678' },
{ name => '鈴木花子', email => 'suzuki@example.com', phone => '080-2345-6789' },
{ name => '佐藤次郎', email => 'sato@example.com', phone => '070-3456-7890' },
);
# コマンドライン引数から形式を取得(デフォルトはcsv)
my $format = $ARGV[0] // 'csv';
# 形式に応じて出力を切り替え
if ($format eq 'csv') {
# CSV形式で出力
say "name,email,phone";
for my $contact (@contacts) {
say "$contact->{name},$contact->{email},$contact->{phone}";
}
}
elsif ($format eq 'json') {
# JSON形式で出力
my $json = JSON::PP->new->pretty->encode(\@contacts);
print $json;
}
else {
die "未対応の形式です: $format\n";
}
|
まとめ
- アドレス帳データをCSVとJSONで出力できるようになりました
- if/elseで出力形式を切り替える素朴な実装を行いました
JSON::PPモジュールを使ってPerlのデータ構造をJSONに変換しました
次回「第2回-新しい形式を追加すると大変!条件分岐の悩み」では、新しい形式を追加するとコードがどうなるか見ていきます。お楽しみに!