概要
モバイルゲームを開発する際は、ExcelやGoogleスプレッドシートなどでマスターデータを管理し、csvとしてエクスポートしてgit管理するといった運用をわりと見かけます。
最近、クライアント/サーバー間でやりとりするマスターデータのフォーマットをcsvからtsvに変えたところ、とても使い勝手が良かったため紹介します。
tsvとは
タブを区切り文字として使用したデータ形式。
csvはカンマを区切り文字とするが、そのカンマ(,
)がタブ(\t
)になったもの。
具体的には以下のようなテキストデータとなる。
csv
name,hp,atk
スライム,10,2
ゴブリン20,4
tsv
name\thp\tatk
スライム\t10\t2
ゴブリン\t20\t4
tsvのメリット
- 言語やライブラリへの依存がとても少なく、シンプルにパースすることができる
- わりと最近のシステムだとcsvファイルとして普通に読み込める
コードサンプル
C#でtsvを出力
var line = string.Join("\t", fields);
C#でtsvをパース
var fields = line.Split('\t');
PHPでtsvを出力
$line = implode('\t', $fields);
PHPでtsvをパース
$fields = explode('\t', $line);
tsvのデメリット
- 文字列中にタブを使用したい時は別の文字列に置換する必要がある
- マスターデータでタブを文字列として使用したいシチュエーションはあまりないが…
- 古いシステムだと読み込めないものがある
csvのメリット
- とても一般的に使用されている
- 以下略
csvのデメリット
- tsvのようにシンプルにパースすることができない
- 後述のようにダブルクォーテーションを考慮する必要がある
- 文字列としてカンマを使用したい時はダブルクォーテーションで囲う必要がある
- ダブルクォーテーションを使用している箇所と使用していない箇所が混在しがち
- tsvに比べてロジックが複雑なためパースコストが高い
- シンプルにカンマ区切りでパースするだけならtsvとコストは変わらないが、マスターデータでキャラクターの説明文にカンマを使用するなど、カンマを文字列として使用したいシチュエーションがわりとあるため
- ライブラリによっては細部の対応オプションが異なる
まとめ
tsvからcsvへの変換は容易なため、非エンジニアがマスターデータを参照する時はcsvとして扱いつつ、クライアント/サーバー間のやりとりはtsvとして扱うなど、柔軟に使い分けられると双方のメリットが最大限に活かせるのではないかと思います。