【コードジェネレータ】Excel などから TSV を貼り付けて、C# のオブジェクトリスト初期化コードを生成する
はじめに
ソースコードとデータは切り離して管理すべきですが、それでもコード中にデータを埋め込みたいケースはしばしば発生します。テストコードとか。
そのようなデータの元ネタとして、Excel や Numbers や Google Spreadsheet などの表計算ソフトや、ObjectBrowser などの RDBMS クライアントを用いたいという要件はあるかと思います。
そのようなデータ元ネタは「コピー」すると、TSV 文字列としてクリップボードに格納されます。その TSV を「ペースト」してコードを生成してくれるジェネレータを JSFiddle で作りました。
コードジェネレータ
左の入力欄に、サンプルのように TSV 文字列をコピペして、convert ボタンをクリックしてください。右側の入力欄に生成したコードが書き出されます。
サンプル文字列がすでに入力されているので、convert ボタンをクリックするだけで動作を確認できます。
生成されるコード例
以下のようなコードが出力されます。
var dataSrc = new[]{
@"1 Apple 200",
@"2 Banana 150",
@"3 Citrus 300",
};
var data = dataSrc
.Select(e => e.Split(' '))
.Select(e => new
{
Id = e[0],
Name = e[1],
Price = e[2],
});
foreach (var item in data)
{
Console.WriteLine(item.ToString());
}
念のため、ソースコードも載っけておきます。JSFiddle がサービス終了しちゃうかもしれませんからね。
それに、オフラインで使いたいという要件もあるかもしれません(その場合、CDN のところは修正してください)。
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
@media (prefers-color-scheme: dark) {
body {
background-color: #333;
color: #fff;
}
textarea {
background-color: #444;
color: #fff;
}
}
</style>
</head>
<body>
<div id="app">
<textarea name="" id="src" cols="30" rows="10" v-model="src" placeholder="Excel などからコピペしてください"></textarea>
<button v-on:click="convert">convert</button>
<textarea name="" id="result" cols="30" rows="10" v-model="result"></textarea>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
var app = new Vue({
el: "#app",
data: {
src: "Id\tName\tPrice\n1\tApple\t200\n2\tBanana\t150\n3\tCitrus\t300",
result: "",
},
methods: {
convert: function (e) {
var lines = this.src.split("\n");
var ret = "var dataSrc = new []{\n";
for (let i = 1; i < lines.length; i++) {
ret += " @\"";
ret += lines[i];
ret += "\",\n";
}
ret += "};\n\n";
ret += "var data = dataSrc\n";
ret += " .Select(e => e.Split('\t'))\n";
ret += " .Select(e => new {\n";
var colnames = lines[0].split("\t");
for (let j = 0; j < colnames.length; j++) {
ret += " " + colnames[j] + " = e[" + j + "],\n";
}
ret += " });\n\n";
ret += "foreach (var item in data)\n";
ret += "{\n";
ret += " Console.WriteLine(item.ToString());\n";
ret += "}\n";
this.result = ret;
}
}
});
</script>
</body>
</html>
おわりに
以前なら、このようなコードは Excel の VBA で作成していました。
でも Excel の無い環境もあるでしょうし、VBA だと共有したい時に配布しないといけないんですよね。共有したいツールが増えると、手間も増えます。
そのような点から、JavaScript を使った Web サービスの方が、作り手の視点からも、使う側の視点からも嬉しい気がしてきました。Web サービスになっていれば URL をメールやチャットで送るだけですからね。JSFiddle や CodePen のような便利なサービスもありますし。