Excelやスプレッドシートなどの表計算アプリを利用していて、表の行と列を入れ替えたいと思ったことはないでしょうか。実際、それぞれのアプリには行列を交換する方法が用意されています。それでも、なでしこを利用することで細かい制御が可能になります。今回は、行列を入れ替えるプログラムを作ってみましょう。

  • シートの行と列を交換するプログラムを作ってみよう

    シートの行と列を交換するプログラムを作ってみよう

行列を入れ代えるとは?

大抵の表計算アプリは行方向と列方向を持つ二次元の表を扱うことになります。例えば、各都道府県の人口を表す表を作る場合、列(縦)方向に各都道府県を記述し、行(横)方向に年度を記述します。また、人気の商品のモデルごとのスペック表であれば、以下のように、列方向にモデル名、行方向に各情報項目を持つ表を作るでしょう。

  • 人気のRaspberry Piの各モデルのスペック表を作ったところ

    人気のRaspberry Piの各モデルのスペック表を作ったところ

しかし、この表は横に長くなってしまっており、全ての項目を見るためにはスクロールしなくてはなりません。そこで、行と列を入れ替えることで、以下のようにスッキリした表にすることができます。

  • 行と列を入れ替えたところ

    行と列を入れ替えたところ

表計算アプリを使っていると時々必要となる処理です。もちろん各表計算アプリに標準で行列を入れ替える機能が備わっています。

Excelであれば、以下のような手順になります。

  • (1) 行列の入れ替えを行う表を範囲選択しコピー
  • (2) 貼り付け先のセルを選択して右クリック
  • (3) 「形式を選択してペースト>行/列の入れ替え」をクリック

スプレッドシートならば以下のような手順です。

  • (1) 行列の入れ替えを行う表を範囲選択しコピー
  • (2) 貼り付け先のセルを選択して右クリック
  • (3) 「特殊貼り付け>転置して貼り付け」をクリック

なでしこを利用して行列を入れ替えるメリット

さて、この処理をなでしこを利用して実現してみましょう。とは言え、標準で用意されているのに敢えてなでしこを使うメリットがあるでしょうか。大いにあります。まず、表計算アプリの中には、行列の入れ替え機能を備えていないものがあるかもしれません。その場合、何かしらのツールを使う必要があります。なでしこならブラウザで実行できるのでとても手軽です。

また、行列を入れ替えるのと同時に表の項目を並び替えたり、何かしらの置換処理も一緒に行いたいかもしれません。表計算アプリだけで、こうした、細かい処理を実現するのは非常に骨が折れるものです。自作の数行のプログラムで一気に処理が行えるので、とても便利です。

表計算アプリのクリップボードを操作する方法

なお、プログラムを作る前に、どのように表計算アプリのデータを操作できるのか調べて見ましょう。Excelやスプレッドシートなど、大抵の表計算アプリでは、シート内の複数セルをコピーすると、コピーした範囲の複数セルを、タブ区切りのCSVデータとして得られるようになっています。

試しに、表計算アプリの複数セルをコピーして、テキストエディタに貼り付けてみてください。例えば、先ほどのRaspberry Piのスペック表の一部分をコピーすると、以下のようになります。(なお、分かりやすく改行の部分に(改行)、タブの部分に(タブ)と書き込みました。)

モデル(タブ)   発売日(改行)
1 Model B(タブ)   2012年2月(改行)
1 Model B+(タブ)  2014年7月(改行)
2 Model B(タブ)   2015年2月(改行)

それで、このタブ区切りCSVデータの内容を書き換えて、表計算アプリで貼り付けてみましょう。すると別のセルに綺麗に貼り付けることができます。

なでしこで行列を入れ替えるプログラム

それでは、なでしこのプログラムで、行列を入れ替えるプログラムを見てみましょう。まず、「なでしこ3簡易エディタ」を開いて以下の2行のプログラムを貼り付けておきます。

「行列交換したい表は?」と尋ねる。
TSV取得して表行列交換して、表TSV変換して表示。

そして、表計算アプリから行列交換したい範囲をコピーします。このとき空列や空行が含まれていると、行列交換したときずれてしまう可能性があります。 (表を全選択した場合、空行が含まれる可能性があるので範囲を指定してコピーしてください。) その後、上記のプログラムを実行します。ダイアログが出るので、そこに表を貼り付けて[OK]ボタンを押します。

  • 表を貼り付けて実行したところ

    表を貼り付けて実行したところ

すると、タブ区切りのCSVデータがテキストボックスに表示されるので、それをコピーして表計算アプリのシートに貼り付けましょう。すると、行列が交換された状態でシートに貼り付けられます。

  • クリップボードから貼り付けたところ

    クリップボードから貼り付けたところ

なお、ブラウザの入力ボックスには複数行のデータが貼り付けられないように見えるのですが、Chrome91ではWin/Mac共に問題なく動作しました。なお、使いやすくテキストボックス上で試せるプログラムも作ってみました。うまくいかない場合やすぐに使いたい場合、こちらから使ってみてください。

プログラムを確認してみましょう。わずか2行のプログラムです。1行目はブラウザの入力ボックスを利用してデータを入力します。2行目ではタブ区切りのCSVデータ(TSVとも言います)を、まずなでしこのデータ形式に直すために「TSV取得」命令を実行し、その後で「表行列交換」命令を使います。これで表の行と列が交換されます。そして、これを「表TSV変換」で再び文字列のタブ区切りCSVデータに書き戻して表示します。なでしこの標準命令を組み合わせただけなので実に簡潔なプログラムで実現できました。

そして、もし表の中にある「Model」という語句を「モデル」と一括置換したいなら、以下のように2行目に「置換」命令を書き加えるだけで済みます。

「行列交換したい表は?」と尋ねる。
「Model」を「モデル」に置換。
TSV取得して表行列交換して、表TSV変換して表示。

まとめ

このように、表計算アプリをメインで使いつつも、ちょっとした置換処理や表変形を実行したい場合には、なでしこと組み合わせると便利です。特に、定期的にこうした表の変形処理が必要な場合など、「なでしこ3貯蔵庫」にプログラムを保存して活用すると良いでしょう。ログインさえすれば、貯蔵庫のプログラムは公開せずに利用できるので業務データでも安心です。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。