% CSVをちょっと高度に読み込む．
% [OutSt Indexes] = csvread_ext(filename,delimiter,indexes,rettype,ignorelu)
% filename  : 読み込むファイル名
% delimiter : CSVの区切り文字．csvなので通常','を指定．省略ならば','が設定される
% indexes   : 読み込み対象列のindex文字列．複数の場合はセル配列にする.
%             すべて読み込む場合には'all'を指定．省略ならば'all'
% rettype   : 出力する形式．'mat'=行列で読み込む．OutStは行列になる．
%             行列の場合，indexesにインデックスと列番号が格納される．
%             'struct'=構造体として読み込む．インデックスをフィールド名として
%             データを読み込む．省略すると'struct'が設定される
% ignorelu  : インデックス指定時，指定したインデックスの大文字小文字を無視する．
%             true(無視) もしくは false(無視しない) で指定．省略時は true
% 
% 使用例1
% OutSt = csv_struct_read('001.csv');
% →001.csvの中身が，インデックスをフィールド名としてOutSt構造体に読み込まれる
% step = OutSt.step;
% として，データを取り出したりなんかしちゃったりしてください．
%
% 使用例2
% [OutMat index] = csv_struct_read('001.csv',',',    ...
%						  {'step','time','pos'},'mat',true); 
% →001.csvのstep，time，posに合致する列のデータを，Outmatに設定，
% 同時にそのインデックスと列の関係をindexに出力する
% indexが出力されるので，たとえばstep列のデータがほしい場合に，
% 何行目にstepがあるかわからなくても，(あるいは，データが増えたりして列がかわっても)
%		step = OutMat(:,indexes.step);
% といった名前による取り出し方も可能となる．

function [OutSt Indexes] = csvread_ext(filename,delimiter,indexes,rettype,ignorelu)
%%
%  out = csv_struct_read('001.csv',',')

% 引数のエラー処理

if ~exist('delimiter','var')
    delimiter = ',';
end
if ~exist('indexes','var')
    delimiter = 'all';
else
    if ~isempty(intersect(delimiter,[true false]))
        error('デリミタの設定値が向こうです．');
    end
end
if ~exist('ignorelu','var')
    ignorelu = true;
else
    if ignorelu ~= true
        ignorelu = false;
    end
end
if ~exist('rettype','var')
    switch nargout
        case 2
            types = 2;
        case 1
            types = 1;
        otherwise
            error('出力が多すぎます．');
    end
else
    rettype = lower(rettype);
    if ~isempty(intersect(rettype,{'st','struct'}))
        types = 1;
    elseif ~isempty(intersect(rettype,{'mat','matrics','matrix'}))
        types = 2;
    else
        error('戻り値形式の設定値が向こうです．')
    end
end

if length(delimiter) > 1
    delimiter = delimiter(1);
end

% データ読み込み
data = importdata(filename,delimiter);

if length(data.textdata)==1
    texts = strread(data.textdata{1},'%s','delimiter',',');
else
    texts = data.textdata;
end
if length(texts)>=size(data.data,2)
    %ラベル多！しゃあねぇ．後ろを消すか．
    for i=1:size(data.data,2)
        tecs{i} = texts{i};
    end
elseif length(texts)==size(data.data,2)
    %うむうむ．
    tecs = texts;
else
    %ラベル少な！
    tecs = texts;
    for i = (length(texts)+1):size(data.data,2)
        tecs{i} = ['husoku' num2str(i)];
    end
end

%抜き出す部分の設定
if strcmp(indexes,'all')
    indexes = tecs;
end
if ignorelu
    indexes2 = lower(indexes);
    tecs2 = lower(tecs);
else
    tecs2 = tecs;
end

for i = 1:size(data.data,2)
    if ~isempty(intersect(tecs2{i},indexes2))
        OutSt.(tecs{i})=data.data(:,i);
    end
end

% 出力タイプがマトリクスの場合
if types == 2
    for i = 1:length(indexes)
        [res ia ib]=intersect(indexes2{i},tecs2);
        OutSt2(:,i) = OutSt.(tecs{ib});
        Indexes.(tecs{ib}) = i;
    end
    clear OutSt
    OutSt = OutSt2;

end
%%