0

各月の次のような「平均」と「深さ」のデータを抽出するにはどうすればよいですか?

MEAN, S.D., NO. OF OBSERVATIONS


                      January                February       ...            
 Depth       Mean   S.D.  #Obs       Mean   S.D.  #Obs       ...
     0      32.92   0.43     9      32.95   0.32    21      
    10      32.92   0.43    14      33.06   0.37    48      
    20      32.88   0.46    10      33.06   0.37    50      
    30      32.90   0.51     9      33.12   0.35    48      
    50      33.05   0.54     6      33.20   0.42    41      
    75      33.70   1.11     7      33.53   0.67    37      
   100      34.77            1      34.47   0.42    10      
   150                                                                                           
   200

                         July                  August               
 Depth       Mean   S.D.  #Obs       Mean   S.D.  #Obs       
     0      32.76   0.45    18      32.75   0.80    73      
    10      32.76   0.40    23      32.65   0.92   130      
    20      32.98   0.53    24      32.84   0.84   121     
    30      32.99   0.50    24      32.93   0.59   120      
    50      33.21   0.48    16      33.05   0.47   109      
    75      33.70   0.77    10      33.41   0.73    80      
   100      34.72   0.54     3      34.83   0.62    20      
   150                              34.69            1                                                     
   200 

データ間に定義できない数のスペースがあり、先頭に導入行があります。

ありがとうございました!

4

3 に答える 3

0

たとえば、最初の 2 列だけを取得したい場合は、textscan() が最適です。

fid = fopen('yourfile.txt');

tline = fgetl(fid);
while ischar(tline)
    oneCell = textscan(tline, '%n'); % read the whole line, put it into a cell
    allTheNums = oneCell{1}; % open up the cell to get at the columns

    if isempty(allTheNums) % no numbers, header line
        continue;
    end

    usefulNums = allTheNums(1:2) % get the first two columns
end

fclose(fid);

textscanフィードした文字列を空白がある場所で自動的に分割するため、列間の未定義の数の文字列は問題になりません。数値を含まない文字列は、範囲外または不正なデータ エラーを回避するために空としてテストできる配列を提供します。

取得する列をプログラムで把握する必要がある場合は、「深さ」と「平均」という単語をスキャンしてインデックスを見つけることができます。ここでは正規表現が役立つかもしれませんが、textscanうまく機能するはずです。

于 2012-07-26T17:57:53.120 に答える
0

ファイルから行を読み取る方法の例を次に示します。

fid = fopen('yourfile.txt');

tline = fgetl(fid);
while ischar(tline)
    disp(tline)
    tline = fgetl(fid);
end

fclose(fid);

while ループの中でstrtok(またはそれに類するものを) 使用して、各行をスペースで区切られた文字列トークンに分割します。

于 2012-07-09T05:29:26.220 に答える
0

Matlab の正規表現は、構造の少ないテキストからデータを引き出すのに強力です。一般的な正規表現に慣れることは本当に価値があります: http://www.mathworks.com/help/techdoc/ref/regexp.html

この場合、各観測グループ (Mean SD Obs) をキャプチャするパターンを定義します。例: 32.92 0.43 9

ここでは、データの各グループのパターンを確認します。各グループの前には 6 つのスペース (正規表現 = \s{6}) があり、3 つのデータ ポイントは 6 つ未満のスペース (\s+) で分割されています。データ自体は、2 つの浮動小数点 (\d+.\d+) と 1 つの整数 (\d+) で構成されます。

したがって、これをまとめると、キャプチャ パターンは次のようになります (キャプチャするデータのパターンを括弧で囲みます)。

expr = '\s{6}(\d+\.\d+)\s+(\d+\.\d+)\s+(\d+)';

「?」を追加することで、各トークン (つまり、グループ内でキャプチャする各データ ポイント) に名前を追加できます。括弧内:

expr = '\s{6}(?<mean>\d+\.\d+)\s+(?<sd>\d+\.\d+)\s+(?<obs>\d+)';

次に、ファイルを 1 つの文字列変数 'strFile' に読み込み、この定義されたパターンを使用してデータを抽出します。

strFile = urlread('file://mydata.txt');
[tokens data] = regexp(strFile, expr, 'tokens', 'names');

変数 'tokens' には観測グループのシーケンスが含まれ、'data' はフィールド .mean .sd および .obs を持つ構造体です (これらは 'expr' のトークン名であるため)。

于 2012-07-26T16:08:48.313 に答える