コードから判断すると、使ってみませんか
fid = fopen(filename,'rt');
tmp = textscan(fid, '%s %d %d %d %d', 'Headerlines', 10);
fclose(fid);
textscan
デフォルトでは、区切り文字としてスペースと改行を使用します。newlineを区切り文字として明示的に指定すると、区切り文字としてのスペースと移植性が失われます(Windows\r\n
は単一の改行として使用することがよくありますが、Unixから派生したOSはを使用します\n
)。したがって、データを考慮して、それを省略してください。
次に、フープをジャンプして10個のヘッダー行を削除textscan
しますが、そのための優れた組み込みオプションがすでにあります。したがって、これらの手順は必要ありません。regexp
区切り文字としてスペースを使用してパススルーで分割することで続行しますが、textscan
すでにスペースで分割されているため、これも必要ありません。
したがって、上記の3行を使用すると、次のようになります。
tmp =
{9x1 cell} [9x1 int32] [9x1 int32] [9x1 int32] [9x1 int32]
次に、データをより便利に保存します。私は2つの方法を考えることができます:
- セル配列
- 構造
どちらの場合も、最初に一意の名前を見つける必要があります。
[names, inds] = unique(tmp{1});
セル配列の使用
これにより、名前でソートされたデータのセル配列が得られます。
data = [tmp{2:end}];
results = arrayfun(@(x) data(strcmp(tmp{1},x),:), ...
names, 'uniformoutput', false);
results
これで、次のようにインデックスを作成できます。
results{3}(1,4) %# for the 4th '11' for 'Name3'
Matlabは1ベースであるため、4番目ではなく3番目の要素を示してa(3)
いることに注意してください。a
コマンドの内訳:
関数arrayfun
は、入力配列の要素をループし、各要素に関数を適用し、通常の配列(可能な場合)またはセル配列(不可能な場合(エラー)および指定された場合)のいずれかに結果を収集します'uniformoutput', false
。foreach
これは、 -construct に少し似ています。
names
最初のステップで見つかった一意の配列に等しい入力配列を使用する場合、トリックは各名前に適用する関数にあります。この関数は、最初にを使用して(すべての名前を含む配列)@(x) data(strcmp(tmp{1},x),:)
で指定された名前のインデックスを検索します。次に、これらのインデックスを使用して、つまり他のすべてのアレイにインデックスを付けます。tmp{1}
strcmp
data = [tmp{2:end}]
次に、個々の一意の名前の結果がcell-arrayに格納されresults
ます。
構造の使用
さらに一歩進んで、セル配列results
を使用して、より人間が読めるデータ構造にすることができます。前のすべての手順を適用した後、これを実行します。
for ii = 1:numel(names)
output.(names{ii}) = results{ii}; end
これで、名前でデータを参照できます。
output.Name3(1,4) %# to index the 4th '11' from 'Name3'
この構文your_struct.('someString')
は、動的構造参照と呼ばれます。と呼ばれる構造体のフィールドを参照または作成します。your_struc
someString
names{ii}
これで、削除したいアンダースコアが含まれている場合は、次のように定義できます。
camelCase = @(x) regexprep(x, '_+(\w?)', '${upper($1)}')
また
camelCase = @(x) regexprep(x, ' +(\w?)', '${upper($1)}')
スペース用。次に、
for ii = 1:numel(names)
output.( camelCase(names{ii}) ) = results{ii}; end
その最後のもののためのこれらの人への称賛。