1

測定装置によって生成されたテキスト ファイル内の数値データにアクセスしようとしています。ファイルは文字列と数字が混在しており、項目はタブで区切られています。長方形ではないため、dlmread などの matlab のファイル読み込み関数には適していません。ファイルをエクセル スプレッドシートに変換して xlsread で読み込むことはできますが、何百ものファイルを扱っているため、これは選択肢ではありません。

ファイルは次のようになります。

Heading String  
Commenttext 
X Axis  Trace A Trace B 
Frequency   Funct Ch1   Funct Ch2   
Frequency / Hz  Funct Ch1 / dBr Funct Ch2 / dBV 
Hz  dBr dBV 
LOG LIN LIN 
100 -60.35  -71.1446    
10000   -7.48178    -12.0321    
VOID    VOID    VOID    
VOID    VOID    VOID    
Scan #-5    Labeltext   Labeltext   
Hz  V   V   
1.000000000000e+003 3.999999910593e-002 1.000000000000e+000 
A-X/37   A-Y     A-LimLow    A-LimUpp   A-RefY in V     B-X/37   B-Y    B-LimLow    B-LimUpp    B-RefY in V     
1.000000000000e+002 -4.873095199691e+001    VOID    VOID    3.999999910593e-002 1.000000000000e+002 -2.026775796775e+001    VOID    VOID    1.000000000000e+000 
1.172102297533e+002 -4.492478734843e+001    VOID    VOID    3.999999910593e-002 1.172102297533e+002 -2.024411835772e+001    VOID    VOID    1.000000000000e+000 
1.373823795883e+002 -3.994765661259e+001    VOID    VOID    3.999999910593e-002 1.373823795883e+002 -2.022767912575e+001    VOID    VOID    1.000000000000e+000 
1.610262027561e+002 -3.628116388971e+001    VOID    VOID    3.999999910593e-002 1.610262027561e+002 -2.021939551014e+001    VOID    VOID    1.000000000000e+000 
1.887391822135e+002 -3.285059881019e+001    VOID    VOID    3.999999910593e-002 1.887391822135e+002 -2.021928320409e+001    VOID    VOID    1.000000000000e+000 
2.212216291070e+002 -2.987476652701e+001    VOID    VOID    3.999999910593e-002 2.212216291070e+002 -2.022570411546e+001    VOID    VOID    1.000000000000e+000 
2.500000000000e+002 -2.751190343935e+001    VOID    VOID    3.999999910593e-002 2.500000000000e+002 -2.023346726318e+001    VOID    VOID    1.000000000000e+000 
2.592943797405e+002 -2.728162367715e+001    VOID    VOID    3.999999910593e-002 2.592943797405e+002 -2.023601503648e+001    VOID    VOID    1.000000000000e+000

次の点に注意してください: - Scan #-5 の前の値は、ファイル内に何回の繰り返しがあるかを示します - AX/37 は、1 スキャンあたりの行数を示します。- 「VOID」要素は、該当する場合は実際の数値に置き換えられ、その逆も同様です。

存在する値を抽出できるようにしたいと考えています。スクリプトは、トレースのサイズ、繰り返しの回数、または値が数値であるか「無効」であるかに依存しません。

これまでのところ、他のトレッドで与えられたヒントに基づいて、ファイルの行で配列を作成し、次のように各行の最初の 2 つの数字を抽出することができました。

fid=fopen('data.txt');
Rows = textscan(fid,'%s', 'delimiter','\n'); %Creates a temporary array with the rows of the file
fclose(fid);
TraceStarts=strfind(Rows{1,1},'Scan'); %Looks for the start of each trace..
TracesIdx = find(~cellfun('isempty', TraceStarts)); %.. and stores the indexes.
Traces= cellfun(@(x) textscan(x,'%f','delimiter','\t', 'CollectOutput',1), Rows{1,1});

Traces は、行ごとに最大 2 つの最初の数値を持つ各行の配列を含むセルです。2 が見つかった後、フロート項目の検索を停止する理由は謎です...各行の数字と文字列のシーケンスは異なる可能性があるため、指定したくありません。

どんな助けでも大歓迎です。

4

1 に答える 1