Featured image of post 第1回-CSVとJSONでデータを保存しよう - Mooを使ってデータエクスポーターを作ってみよう

第1回-CSVとJSONでデータを保存しよう - Mooを使ってデータエクスポーターを作ってみよう

アドレス帳データをCSVやJSONで保存したい。if/elseで形式を切り替えるシンプルな実装から始めて、Mooを使ったデータエクスポーターの基礎を学びます。

@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
perl 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
perl exporter.pl 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回-新しい形式を追加すると大変!条件分岐の悩み」では、新しい形式を追加するとコードがどうなるか見ていきます。お楽しみに!

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。