文字ベクトルのセル配列から文字の一部だけきりとり新たなセル配列を作る方法を教えてください
Show older comments
例えば下記のような文字列ベクトルのセル配列があるとします
C = {'abcdefg1';'abcdefg2';'abcdefg3';'abcdefg4';'abcdefg5'}
この各行に入っている文字列から次のようなルールで文字列を引き抜き新たなセル配列Dを作る際はどのように書けばよいでしょうか
ルール
先頭3文字を抜く
D = {'defg1';cdefg2';'defg3';'defg4';'defg5'}
大量の手持ちのデータのラベルから新たなデータラベルを作りたいのですが
上記のようなことを記載できず困っております.
ベーシックなことで恐縮ですが教えていただけますと幸いです.
Accepted Answer
More Answers (1)
浩祐 佐々木
on 24 Sep 2021
0 votes
4 Comments
Atsushi Ueno
on 24 Sep 2021
上記の「cell 配列または string 配列内の文字に関数を適用」(リンク貼ってあります)が丁度良い例ですね。
cellfunは、セル配列の要素を1個ずつ任意の関数に入力し、出力する処理を1関数で実行できる代物です。
for i=1:numel(mycell) % 例えば今回の場合はこんな感じ
result{i} = something_func(mycell{i});
end
@は関数の前に置くルールだとヘルプを読み,そのように理解いたしました
⇒はい。因みに@(x)は無名関数で、スペース一つ空けたすぐ後に中身を書きます。普通の名前付関数を指定する場合は@mean(x)や@sum(x)のような形になります
(x),とはどのような意味合いなのでしょうか
⇒@(x)は無名関数の引数です。その後のx(4:end)を記述する為に、セル配列の要素を仲介する変数が必要なのです。
またその後におく’uni'とは何を表しているでしょうか
'uni'とその後のfalse(,'uni',false))を2組セットで設定しています。'uni'は'UniformOutput'の略です。'uni'でも指定可能です。デフォルト値はtrue(1)です。
例えばセル内の数値の合計値や平均値(スカラー)を返す場合はデフォルトのまま何も指定しなくてもOKです。今回のように出力もcell配列の場合はこの'UniformOutput'=false(0)に設定する必要があります。
浩祐 佐々木
on 27 Sep 2021
浩祐 佐々木
on 27 Sep 2021
大事なのは質問文の冒頭にも出てくる「ルール」を正確に見極める事です。
例えば自分の回答は「先頭3文字を抜く」という要件に対し、確認せずに先頭1~2文字しか無い場合も抜いてしまいました。もしこれが稀に見る事象に合わない場合、不具合を引き起こす時限爆弾になります。
今の例を見る限りのルールを決め、正規表現で必要なキーワードを抜き出してみます
- 先頭4文字は除く(文字数は固定、短い文字列は絶対に現れない想定)
- キーワードの文字種類(a~z)と文字数(6文字_3文字)で特定可能(違うかも)
- キーワードの末尾に数字を含む不規則な文字記号が付くので除きたい
検索パターン「^.{4}([a-z]{3,6}_[a-z]{3})」
^ ⇒入力文字列の先頭にマッチする(先頭から始まるパターンにしかマッチしない)
.{4} ⇒.は任意の文字、{4}は量指定子(4個ピッタリにマッチする)
(...) ⇒()内をキャプチャする。因みに括弧文字にマッチするのは\(や\)
[a-z]{6} ⇒[a-z]はa~zの1文字、{6}は量指定子(6個ピッタリにマッチする)
_ ⇒これはアンダースコア自体にマッチ。記号によってはエスケープが必要なので注意
G = {'ABCDabcdef_ghi_0_','1234abcdef_ghi0','+*=~abcdef_ghi[0]',...
'M7g3abcdef_ghi_0_','NE#0abcdef_ghi','****abcdef_ghi2'};
H = regexp(G,'^.{4}([a-z]{6}_[a-z]{3})','tokens'); %因みに、先頭4文字を先読みでマッチから外し'match'で結果を得る方法もあります
cellfun(@(x) x{1}{1}, H, 'uni', false) % 結果を表示
Categories
Find more on 文字と文字列 in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!