2017-09-12 22 views
2

は、入力セルがあると仮定:MATLAB:異なる区切り文字番号のセル配列を分割する方法は?

input=

"82.3 4.3 John"

"4.2 0.0001 Tim Taylor"

これは2by1セルアレイです。私は次のよう2by3配列を得るためにこれを分割する必要があります

"82.3" "4.3" "John"

"4.2" "0.0001" "Tim Taylor"

セルの各行としてsplit(input)又はsplit(input,'\t')戻りエラーがデリミタの異なる数を含みます。

+2

セル内のデータチャンクは、単一の表(\ t)または可変数のスペースで区切られていますか?入力セル配列はどこから来ていますか?データをインポートして、必要な結果を得ることができるかもしれません。 – Gryphon

+0

@グリフォン彼らは名前の間に単一のスペースがある最後のものを除き、単一の表形式で区切られています。私は実際には単一の空白を取り除き、 '\ t 'だけで分割する必要があります。だから、 'x'と' y'の間に一つのスペースがあるときはいつでも、 'xy'のようにセルの中に一つのアイテムを作るべきです。 – fhm

+1

文字列であるため、 'strsplit'がここで動作するかもしれません。 –

答えて

5

あなたはsplitを使用することができますが、それはあなたがcell array containing character vectorsstringsを含むcell arrayを(私が知っている、それはvery confusingです)持っているかどうかに応じて異なります。

あなたinputは次のように表示された場合:あなたはのセル配列を持って次に

input = 

    2×1 cell array 

    '82.3 4.3 John' 
    '4.2 0.0001 Tim Taylor' 

あなたの inputではなく、このように表示されている場合は

str = split(input, char(9)) 

str = 

    2×3 string array 

    "82.3" "4.3"  "John"  
    "4.2"  "0.0001" "Tim Taylor" 


:文字ベクトル、そしてあなたは、このようなタブに分割することができますが

input = 

    2×1 cell array 

    ["82.3 4.3 John"  ] 
    ["4.2 0.0001 Tim Taylor"] 

次に、あなたは文字列のセル配列を持っている、あなたが必要としますタブに分割する前に、文字列の2行1列にセルを連結する:

str = split([input{:}].', char(9)) 

str = 

    2×3 string array 

    "82.3" "4.3"  "John"  
    "4.2"  "0.0001" "Tim Taylor" 


ASCIIタブ文字を指定するにはchar(9)を使用しなければならず、それぞれの場合の出力は2行3列の文字列であることに注意してください。

+0

シンプルで完全な回答!関数splitが比較的新しいことに注意してください。あなたが初期のmatlabのためにコードを動作させたい場合、これを考慮することができます。 –

1

@Ander Biguriはすなわち関数textscan

で、いくつかのファイル・インポート機能付きstrsplit

out=cellfun(@(x) strsplit(x,'\t'), inp,'un',0); out=cat(1,out{:}) 
  • で、示唆したようにザ・は

    %Never remembered how to correctly insert whitespace characters 
    inp = {['82.3' char(9) '4.3' char(9) 'John'];['4.2' char(9) '0.0001' char(9) 'Tim Taylor']} 
    
    1. ことを行うには、いくつかの方法があります

      %with on-the-fly type conversion 
      out = cellfun(@(x) textscan(x,'%f%f%s','delimiter','\t'), inp, 'un', 0); out = cat(1,out{:}) 
      %keeping all values as strings 
      out = cellfun(@(x) textscan(x,'%s%s%s','delimiter','\t'), inp, 'un', 0); out = cat(1,out{:}) 
      
  • 1

    これは美しいではありませんが、それは仕事をしていません:

    clear output % make sure not exist 
    for i = 1:size(input,1) 
        output(i,:) = cellstr(regexp(input{i}, '\t', 'split')); 
    end 
    
    +1

    https://www.mathworks.com/help/matlab/matlab_prog/preallocating-arrays.htmlを参照してください –

    関連する問題