4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MATLABで数字をExcelの列名に変換

Last updated at Posted at 2022-02-24

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

以上に注意すると以下のような関数が作成される.

matlab
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の列名が出力されます.

確認

matlab
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
result
>> number =

     5    14    28    48    49


>> letter = 

  1×5 の string 配列

    "E"    "N"    "AB"    "AV"    "AW"

なんとなくうまくいってそう..

おわりに

本アイデアをくれた質問者の方に, 感謝申し上げます.

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?