やっぱりCSVが好き！

#概要
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c0f09ab4-3ef1-b80e-b864-ed6e5dbb19b3.png" width=20%>　　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/202a733a-61a2-1aee-0d4f-b0c2d113bcef.png" width=20%>![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/48640288-00bf-fdc3-bf42-7f688949eb4f.png)



今回システム連携でCSVがいかに素晴らしいかを再認識していただく回としたいと思います。

CSVとは
従来からある、カンマ区切りと改行コードで構成されたファイルです。
可変長データとも呼ばれますが、最近は単一レイアウトのものを指します。
（一部複合レイアウトなんて変わったものもあります。）
AWSのページにはレガシーIF方式なんて揶揄されてました。。。

それに対してAPIとは
今回はCSVの素晴らしさを証明するため、WebAPIに比較対象として頑張ってもらいます。
SOAPでもRESTでもXMLでも、CSVには勝てないですよ。きっと。

#第１回戦：製造の手間、コストは？
WIN！　CSV
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c0f09ab4-3ef1-b80e-b864-ed6e5dbb19b3.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>


```c#
using System;
using System.Text;
using Microsoft.VisualBasic.FileIO;

namespace CsvParser
{
    class Program
    {
        static void Main(string[] args)
        {
            var parser = new TextFieldParser(@"C:\work\test.csv",
                Encoding.GetEncoding("Shift_JIS"));
            using (parser)
            {
                // カンマ区切りの指定
                parser.TextFieldType = FieldType.Delimited;
                parser.SetDelimiters(",");

                // フィールドが引用符で囲まれているか
                parser.HasFieldsEnclosedInQuotes = true;
                // フィールドの空白トリム設定
                parser.TrimWhiteSpace = false;

                // ファイルの終端までループ
                while (!parser.EndOfData)
                {
                    // フィールドを読込
                    string[] row = parser.ReadFields();
                    foreach (string field in row)
                    {
                        // 読み込んだデータをなにかに活用。

                    }
                    Console.WriteLine();
                }
            }
            Console.ReadKey();
        }
    }
}
```


CSVは言わずともしれたやり方で、モジュールやフリーソフトも豊富です。
ExcelVBAでも簡単に利用できちゃいます。
文字コードや記号、エスケープを取り決めておけば簡単に作っても意外と末永く使えます。

LOSE??　API

```c#
public class ContactRepository
{
    public Contact[] GetAllContacts()
    {
        return new Contact[]
        {
            new Contact
            {
                Id = 1,
                Name = "Glenn Block"
            },
            new Contact
            {
                Id = 2,
                Name = "Dan Roth"
            }
        };
    }
}
```
あれ？ちょっと簡単だぞ。。。でも、
APIは手法にもよりますが、提供する・提供される場合もCSVより製造コストは高くなることが多いです。爆速でAPI・・・ってページもありますが、SLAが絡んでくると正直１．５倍から２倍くらいはコストかかりますね。
相手がどう使うか、どれくらいの頻度で呼ばれるか、呼べるかを考慮して設計、製造が肝です。

#テストは？
WIN！　CSV
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c0f09ab4-3ef1-b80e-b864-ed6e5dbb19b3.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>
製造コストもですが、定義を事前に取り決めてやり取りするためテストがクローズして対応できるメリットがあります。

LOSE。。。　API
最低でもスタブが無いとかなり辛いです。
呼ぶ、呼ばれるシーケンスをしっかりと抑える必要があるので、その分テスト工数も膨らみがちです。

#相手とつなぐためのインフラは？
WIN！？　API
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/48640288-00bf-fdc3-bf42-7f688949eb4f.png)<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>
サーバに基本包含されているWebサービスを利用することができる。
また、外部に公開しても比較的安価な証明書の組み合わせで対応できる事がメリットです。

LOSE。。。　CSV
特別なミドルウェアは不要ですが、やはりファイル単体でそれなりの情報が読み取れるためVPNやSFTP等の暗号化されたファイル配置場所がマストです。

#データ量によってどう？
WIN！　CSV
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c0f09ab4-3ef1-b80e-b864-ed6e5dbb19b3.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>
１０万件でもかなり高速！

LOSE。。　API
正直大量レコードの取扱は劣勢です。
でも、画像データや長文、改行コードに記号、汎用性、自由度が高いです。

#リアルタイム性は？
WIN！？　API
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/48640288-00bf-fdc3-bf42-7f688949eb4f.png)<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>
ダントツです。
ほしいものが欲しいときに欲しいだけ。

LOSE。。。　CSV
残念ながら同列で、タイミングが決まっている前提なのでリアルタイム性は今ひとつ。
取り決め次第ですが、
１件欲しいのに、全件送りつけられたり。
正直１０分未満では使えないかも。

#保守性は？
WIN!　CSV
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c0f09ab4-3ef1-b80e-b864-ed6e5dbb19b3.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c1ae3a9a-84d2-b2b1-45d8-0a95ead0b781.png" width=20%>
やり取りのバックアップを保持できる。
最悪メモ帳があればなんとかなる。
なんなら直せちゃう。

LOSE。。　API
正直、後で不具合言われてもシステムエラーになっていないとわからない事が多いです。
そしてリリース時はシステム停止が必須。（CSVはインターバルの時間があるので、そのときにそっとリリースできちゃう。）

#総じて勝敗は？
全試合の集計を行うと、下記となります！
優勝　CSV！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/e8d0cc7f-68a0-6777-5009-251374786648.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/c0f09ab4-3ef1-b80e-b864-ed6e5dbb19b3.png" width=20%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256178/f30261ee-d2b3-8d45-e7bd-8353085ddfe9.png" width=20%>

やはりコスト、テストの優秀さが際立っています！

残念　API
まだまだ発展途中！

上記以外に
DBリンク
いいところもたくさんありますが、ソフトウェアライフサイクルが短くなってクラウド連携も多々ある世の中で同一ミドルウェア前提の密結合は時代に逆行感がありますね。

XML
一時期流行った時期も有りましたが、今はあまり見ない。。。

EDI（固定長ファイル）
電話回線を使った連携。
量販店とかたくさんありましたが、もうすぐなくなりますよ！
これから新規で使ってはいけませんよ！

Excel？メール？
人の手が介在しそうですね。。。

#最後に
長々と読んでくださって感謝しております！
私の経験からの完全なる偏見で記載しておりますので、コメント等で反論大歓迎です。
（実はそろそろAPI派に移るための糧にしようと思っていたりして。。。）