2/25 関数変更
はじめに
ある日, こんな質問が来ました.
「MATLABで列番号をExcelの英表記に変換することってできますか?」
ということで, MATLAB Documentationの検索タイムが始まりました. 私もExcelスプレッドシートからデータをMATLABにインポートしたことは幾度となくありましたので, その周辺のDocumentationを探していたのですが, 見つかりませんでした. そこで, 「そうだ自分で作ろう!!」となりました.
この記事では, MATLAB R2021bを使用しております.
また, 本記事で示されたコードは, 今回示した問題以外での検証等は行っておりません.
基本的な指針
Excelの列名はアルファベットによって表されます. つまり, 列名は10進法ではなく26進法であらわされます. MATLABには, 10進数整数を$n$進数表現に変換する便利な関数, dec2baseが用意されています. そして, 得られたchar配列の各文字をASCIIコード表に基づいて, 以下のように変換します.
変換前 文字 | 変換前 10進数 | 変換後 文字 | 変換後 10進数 |
---|---|---|---|
'0' | 48 | 'A' | 65 |
'1' | 49 | 'B' | 66 |
'2' | 50 | 'C' | 67 |
'3' | 51 | 'D' | 68 |
'4' | 52 | 'E' | 69 |
'5' | 53 | 'F' | 70 |
'6' | 54 | 'G' | 71 |
'7' | 55 | 'H' | 72 |
'8' | 56 | 'I' | 73 |
'9' | 57 | 'J' | 74 |
'A' | 65 | 'K' | 75 |
'B' | 66 | 'L' | 76 |
'C' | 67 | 'M' | 77 |
'D' | 68 | 'N' | 78 |
'E' | 69 | 'O' | 79 |
'F' | 70 | 'P' | 80 |
'G' | 71 | 'Q' | 81 |
'H' | 72 | 'R' | 82 |
'I' | 73 | 'S' | 83 |
'J' | 74 | 'T' | 84 |
'K' | 75 | 'U' | 85 |
'L' | 76 | 'V' | 86 |
'M' | 77 | 'W' | 87 |
'N' | 78 | 'X' | 88 |
'O' | 79 | 'Y' | 89 |
'P' | 80 | 'Z' | 90 |
この表によれば, 数字には17を加え, アルファベットには10を加えればよいことがわかります. ただし, 以下の二つに注意することが必要です.
- 10の位以上の文字は0ではなく1から始まるため, 1を差し引いてから変換を行う必要がある.
- MATLABの配列はインデックスが1から始まるため, 変換前に1を引く必要がある.
作成した関数 excel_column
以上に注意すると以下のような関数が作成される.
function answer = excel_column(num_column)
%
% excel_column - Convert Interger to the string equivalent to Excel column
%
% string = excel_column(num_column)
%
% -Inputs-
% num_column - Scalar Integer Number
%
% -Outputs-
% string - Excel Column Name String
%
% --- Usage Example ---
%
% number = randi(100)
% letter = excel_column(number)
%
% ---------------------
%
%
if (isscalar(num_column))
answer = dec2base(round(abs(num_column))-1,26);
for ii=1:length(answer)
if (ii ~= length(answer))
answer(ii) = answer(ii) - 1;
end
if (answer(ii) > 63)
answer(ii) = answer(ii) + 10;
elseif (answer(ii) > 47)
answer(ii) = answer(ii) + 17;
end
end
answer = string(compose(answer));
else
error('Sorry!! This function can get only scalar.');
end
end
この関数は引数としてスカラー値を受け取り, そのスカラー値に相当するExcelの列名が出力されます.
確認
clear all; close all; clc;
%% Convert Number to Alphabet following Excel Spread sheet
n = 5; max_n = 50;
number = randi(max_n,1,n);
letter = string(zeros(1,n));
for ii=1:n
letter(1,ii) = excel_column(number(ii));
end
number
letter
>> number =
5 14 28 48 49
>> letter =
1×5 の string 配列
"E" "N" "AB" "AV" "AW"
なんとなくうまくいってそう..
おわりに
本アイデアをくれた質問者の方に, 感謝申し上げます.