0

いくつかのヘッダーと数値データを含む大きなテキスト ファイルがあります。ヘッダー行を無視して、特に列 2 と列 4 のデータを出力したいと考えています。

サンプルデータ

[headers]  
line1  
line2  
line3

[data]  
1 2 3 4  
5 6 7 8  
9 10 11 12

次のコードを使用してみました。

FID = fopen('datafile.dat');  
data = textscan(FID,'%f',4,'delimiter',' ','headerLines',4);  
fclose(FID);

0x1 セルの出力しか得られない

4

1 に答える 1

1

これを試して:

FID = fopen('datafile.dat');
data = textscan(FID,'%f %f %f %f', 'headerLines', 6);
fclose(FID);

data1x4 セル配列になります。各セルには、データの各列の値である double 値の 3x1 配列が含まれます。

data{2}と を実行すると、データの 2 列目と 4 列目にアクセスできますdata{4}


元のコードの主な問題は、データ ファイルに6 つのヘッダー行があることですが、指定したのは4 つだけです。

さらに、ただし、formatSpec に一致する回数の指定で問題が発生します。たとえば、次のコードを見てください

data = textscan(FID,'%f',4);

これは、浮動小数点値の照合を 4 回試行することを指定します。4 つの値を一致させた後、textscan停止することに注意してください。簡単にするために、データ ファイルにデータのみが含まれている (つまり、ヘッダー行がない) と仮定して、そのコードを複数回実行すると、次の結果が得られます。

>> FID = fopen('datafile_noheaders.dat');
>> data_line1 = textscan(FID,'%f', 4)

data_line1 = 

    [4x1 double]


>> data_line1{1}'

ans =

     1     2     3     4

>> data_line2 = textscan(FID,'%f', 4)

data_line2 = 

    [4x1 double]

>> data_line2{1}'

ans =

     5     6     7     8

>> data_line3 = textscan(FID,'%f', 4)

data_line3 = 

    [4x1 double]

>> data_line3{1}'

ans =

     9    10    11    12

>> data_line4 = textscan(FID,'%f', 4)

data_line4 = 

    [0x1 double]

>> fclose(FID);

textscan は、呼び出されるたびに「中断」したところから再開することに注意してください。この場合、textscan が呼び出される最初の 3 回で、データ ファイルから 1 行が返されます (4x1列のデータを含むセルの形式で)。4 番目の呼び出しは空のセルを返します。あなたが説明したユースケースでは、この形式は特に役に立ちません。

一番上に示した例は、あなたが達成しようとしているものに対して、より扱いやすい形式でデータを返す必要があります。この場合、データの各行の 4 つの浮動小数点値に一致し、このパターンに一致しなくなるまでテキストの各行を続行します。

于 2013-08-30T15:00:25.797 に答える