MATLABでスタバのフードを選ぼう

# スタバに行って仕事をしよう。

　いつものようにパイクプレイスのグランデをお願いしたのはいいんですけど、なんかつまみながら仕事をしたい気もします。アップルパイがあれば一択なんですけど、秋限定でした。


# 一緒に行った人の意識が高い。

　「私、今日のカロリーは残り 200kcal しか取れないんだけど、何がいいかな。」
　「・・・」

　じゃあコーヒーだけでいいじゃん、とは言わずに、スタバの Wi-Fi に接続してMATLABのプログラムを書きましょう。
　ここにいろいろ情報がありそうですね。
　https://www.starbucks.co.jp/allergy/

　MATLAB だと websave ってコマンドで保存できます。カロリーのついでに、タンパク質・脂質・炭水化物・塩分も取ってきちゃいましょう。

```matlab
%% ウェブから持ってこよう。
url = "https://www.starbucks.co.jp/assets/images/web2/images/allergy/pdf/allergen-food.pdf";
websave('starbucks_food.pdf',url)

%% 関連しそうな文字列をごっそり取り出す。
D = extractFileText('starbucks_food.pdf');
D = extractBetween(D,"食塩相当量（g）","お問い合わせ先");
D = replace(D,newline,' ');
X = regexp(D,'[^0-9]+ [0-9.]+ [0-9.]+ [0-9.]+ [0-9.]+ [0-9.]+','match');

%% テーブルを作ろうね
for n = 1:length(X)
    spl = split(X(n));
    Name(n,1) = join(spl(1:end-5));
    Energy(n,1) = double(spl(end-4));
    Protein(n,1) = double(spl(end-3));
    Fat(n,1) = double(spl(end-2));
    Carbo(n,1) = double(spl(end-1));
    Salt(n,1) = double(spl(end));
end

T = table(Name,Energy,Protein,Fat,Carbo,Salt);

%% 表示
T = sortrows(T,'Energy');
X = reordercats(categorical(T.Name),T.Name);
h = barh(X,T.Energy);

hold on  % 限界 200kcal の線
y = ones(size(X)) * 200;
plot(y,X,'LineWidth',5,'Color','g')
hold off

% 200を超えたやつは、危険な赤色で塗っておこう。
h.FaceColor = 'flat';
idx = h.CData(T.Energy > 200,:);
[m,n] = size(idx);
h.CData(T.Energy > 200,:) = repmat([1 0 0],m,1);
```

　extract** とかは Text Analytics Toolbox の関数ですね。
　rexexp は \d とか使っても数字が取れるけど、６枚入り！みたいな全角数字も取っちゃうので、[0-9.] って書いて半角の数字とピリオドだけ取りましょう。

　こんな結果が出たら安心。

![starbucks200over.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/377d540d-7dc4-d959-89ee-a08017ced4ca.png)

　一番上のシュトーレンすごいな。とりあえず下の13個くらいから選べばいいね。


# 追加の要望があります。

　「とりあえず13個に絞ったから、適当に選んでよ。」
　「最近、塩分も控えてるから、塩分 0.2g 未満のものがいいな。」
　「・・・」

　ご注文を繰り返させていただきながら、コマンドにでも打ってみましょう。

```matlab
% カロリーが 200kcal 未満で、塩分が 0.2g 未満。
Res = T.Name(T.Energy < 200 & T.Salt < 0.2)
```

　コマンドウィンドウを見てみよう。

```
Res = 

  4×1 の string 配列

    " パッケージフード アフターコーヒーミント（ペパーミント）"
    " パッケージフード ホワイトチョコレートマシュマロ"
    " パッケージフード エスプレッソビーンズチョコレート"
    " デザート クランベリーブリスバー"
```



# ミントが嫌われる。

　「４種類あったよ。ペパーミントのやつと・・・・」
　「ミント嫌いなんですけど！ミントってあのフリスクみたいなやつでしょ。あれって口が臭い人が食べるやつじゃん！ミント以外で脂肪分が一番少ないやつがいい！」
　「・・・」

　偏見はさておき、文字は contains で分かるからミント以外を取ればいいね。

```matlab
% カロリーが 200kcal 未満で、塩分が 0.2g 未満で、ミント嫌い。。
Res = T(T.Energy < 200 & T.Salt < 0.2 & ~contains(T.Name,'ミント'),:);
[~,idx] = min(Res.Fat);   % その中で一番脂質が少ない。
Res.Name(idx)
```

```
ans = 

    " パッケージフード ホワイトチョコレートマシュマロ"
```


# マシュマロでいいか。

　「マシュマロ買ってきたよ」

![DSC_0004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/e072b97e-cfab-f138-ca78-c838e02f9cee.jpeg)

　「かわいい！これクリスマスツリーに飾るから、２番目に脂肪分が少ないやつ買ってきて！」
　「・・・」

　脂質順に並べ替えて、２番目を取ればいいね。

```matlab
%% 二番目に脂質が低い。
R = sortrows(Res,'Fat');
R.Name(2)
```

```
ans = 

    " デザート クランベリーブリスバー"
```

# ブリスバーって何なのさ。

　「クランベリーブリスバーっていうの買ってきたよ」

![DSC_0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/50851603-23b7-bd5f-0035-b0e337264934.jpeg)

　「おいしい！これ意外にカロリー低いのね。」

　よかった、一安心。


# グラフの中ではどれだったんでしょうか。

　プロットが残ってたら、こんな感じを追記して確かめよう。

```matlab
%% 図で見てみよう。
idx = find(h.XData == R.Name(2));
text(h.YData(idx),idx,'← これ','FontSize',24,'FontName','Yu Gothic UI');
```

![starbucksfood.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475339/2266338f-b860-36c5-c649-e159ed964c37.png)


# 見つかってよかった。
　MATLAB の練習にはちょうどいいくらいの問題ですね。
　さて仕事するか。。。