1

matlab に読み込みたいデータ ファイルがいくつかあります。残念ながら、それらは非常に複雑な構造を持っています - 少なくとも私が慣れ親しんだものと比較して. この古い例をhttps://www.dropbox.com/s/vbh6kl334c5zg1s/fn1_2.outからダウンロードできるはずです(メモ帳またはワードパッドで問題なく開きます) 。

生データ、正規化された「生」データ、および(間接)フーリエ変換データ+データへの適合の両方がリストされているシンクロトロンデータに基づくデータファイルです。さらに、フーリエ変換からのいくつかの統計があります。

論文の統計から結果を引用する必要があるだけなので、結果の一部をプロットするのはよいことですが、厳密には必要ではありません。ただし、生の正規化されたデータと適合データ、およびフーリエ変換されたデータが必要です。

私の問題

データ ファイルでは、必要なデータの前に統計分析の結果が表示されます。ただし、統計分析の列のサイズはデータ ファイルごとに異なります。これは、インポートする各ファイルのヘッダー行数を手動で変更しない限り、ヘッダーに統計を含めることができないことを意味します。5つのデータファイルのグループをまとめて分析する必要があり、今回は少なくとも約30個のファイルを分析する必要があるため、可能であれば避けたい. 将来的には、この種のデータ ファイルを再度読み込む必要があります。ヘッダー行の数を 30 回変更しても問題ないように思えますが、自動的に変更できると便利です。

考えられる解決策

フーリエ変換されたデータと同様に、生データと正則化データの両方の前に特定の行があり、この行と空白/空の行の後にデータが始まることを示しています。

したがって、正規表現を使用して、この特定の行が表示されるまですべてを無視し、この行ともう 1 行を無視してからデータをインポートするように matlab に指示することができると思います

私はググって、正規表現が使用されているこのトピックを見つけました:かなり複雑なテキストファイルを解析しようとしています

しかし、私は正規表現が初めてで、提案されたコードは私にとって少し複雑です。彼が名前付きキャプチャを使用していることはわかりますが、彼がそれをどのように使用しているかを理解しているかどうか、また必要に応じて採用できるかどうかはよくわかりません。私は公式のmatlabドキュメントをチェックしましたが、それらの例はやや単純です:) ( http://www.mathworks.se/help/matlab/matlab_prog/regular-expressions.html#bqm94nz-1 )

こんなに長い文章を書いてすみません。この問題をどのように進めるかについての提案は大歓迎です

/マーティン

編集

コメントのリンクに基づいて使用したコード:

fileName = 'data.dat';
inputfile = fopen(fileName);

% Ignore all until we see one that just consists of this:
startString = '       R          P(R)      ERROR';

mydata = [];

while 1
 tline = fgetl(inputfile);

 % Break if we hit end of file, or the start marker
 if ~ischar(tline)  ||  strcmp(tline, startString)
    break
 end

 data = sscanf(tline, '%f', 3 );
 mydata(end+1,:) = data;

end
fclose(inputfile); 

コードを実行すると、次のエラーが表示されます。

 Subscripted assignment dimension mismatch.

 mydata(end+1,:) = data;

奇妙なレイアウト/コメントにリンクを残して申し訳ありません。投稿に2つ以上のリンクを含めることは許可されておらず、まだ新しい回答を追加することはできません-どちらも担当者が少ないためです:)

4

1 に答える 1

0

ブロックは少なくとも 2 つの新しい行で区切られているため、それを使用してテキストをブロックに分割し、個別に分析できます。このコードを試してください

fileH = fopen('fn1_2.out');
content = fscanf(fileH, '%c', inf);
fclose(fileH);

splitstring = regexp(content, '\r\n\r\n', 'split');

blocks = regexp(splitstring, '\d\.\d{4}.*\r\n.*\d\.\d{4}','match');
numericBlocksIdx = find(cellfun(@(x) ~isempty(x), blocks));
numericBlocks = splitstring(numericBlocksIdx);

numericBlocks{1}、 、 ... には、関心のあるテーブルが含まれていますnumericBlocks{2}。一部のテーブルでは、2 つの改行で区切られていないため、ヘッダーも含まれていることに注意してください。ここから、textscanなどの関数を使用してデータを行列に読み込むことができます。

于 2013-02-13T18:08:46.937 に答える