「textscan」の大きなテーブルのすべての列の変換仕様を入力しないでください
質問
私は使用してテーブルからデータを読んでいます textscan()
. 。テーブルには90の列があり、各列の値を浮動小数点数として読みたいと思います。ドキュメントを見ると、仕様を使用する必要があります %f
- しかし、それは90回使用する必要があるようですので、私はこれに終わります:
c = textscan(fid,'%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f');
これは基本的に機能しますが、テーブルにあるすべての列のタイピング仕様を避けるために何らかの方法があるかどうか疑問に思っています。
解決
使用する repmat
列の数に基づいてフォーマット文字列を作成します。
nCols = 60;
format = repmat('%f', [1 nCols]);
c = textscan(fid, format);
これは、いくつかの文字列列が混在する場合に使用するのに十分な柔軟性です。
nNumberCols = 58;
format = ['%s%s' repmat('%f', [1 nNumberCols])];
c = textscan(fid, format);
他のヒント
既知の区切り文字によって区切られた90列の浮動小数点数で構成される非常にシンプルなASCIIファイルの場合、MATLAB関数を使用する方が簡単かもしれません dlmread
.
たとえば、ファイルrand.txtが次の場合:
0.8147 0.0975 0.1576 0.1419 0.6557
0.9058 0.2785 0.9706 0.4218 0.0357
0.1270 0.5469 0.9572 0.9157 0.8491
0.9134 0.9575 0.4854 0.7922 0.9340
0.6324 0.9649 0.8003 0.9595 0.6787
使用できます: randmat=dlmread('rand.txt');
「%f」のみでテキストスカンを実行してから、必要に応じて再シャープするか、必要に応じてセルに変換できます。
fid=fopen('bla.txt','r');
M=textscan(fid,'%f')
M=reshape(M{1},[],5)
M=num2cell(M,1)
fclose(fid);
使用をお勧めします:
fileId=fopen('fileloc.txt');
formatSpec='%f';
N=90;
data=textscan(fileId,formatSpec,N);
所属していません StackOverflow