0

テキスト ファイルから一部の固定幅 (6E12) データを読み取ることができません。ファイルの先頭にスペースがあることに注意してください。

最初の行はそれほど重要ではありません。ただし、2 行目からは 59 個の値を読み取りたいと考えています。

file.txt

 PleaseAnswer    3 ,   ThisQuestion    40
 0.00000E+00 4.78181E+01-4.76356E+01 3.76280E-01 0.00000E+00 1.59238E+00
 1.88171E+00 1.73928E-06 0.00000E+00 3.57826E+01 0.00000E+00 0.00000E+00
 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
 0.00000E+00 3.75261E-07 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
 0.00000E+00 0.00000E+00 0.00000E+00 3.28103E+01 0.00000E+00 0.00000E+00
 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00 0.00000E+00
 ...

終了ファイル.txt

以下に示すように、負の符号が原因で 2 番目と 3 番目の値で問題が発生します。先頭にスペースがない理由がわかりません。負の数値を除いて、ほとんどすべての数値に先行スペースが必要です。

私はこのファイルを読み込もうとしています

fid = fopen(filename);
dontcare = textscan(fid, '%s %d %s %s %n', 1);
fixme = textscan(fid, '%12s', 59, 'Delimiter', '', 'Whitespace', '');
fixme{1}

ans = 

    ' 0.00000E+00'
    '4.78181E+01-'
    '4.76356E+01 '
    '3.76280E-01 '
    '0.00000E+00 '
    '1.59238E+00'
    ' 1.88171E+00'
    '1.73928E-06 '
    '0.00000E+00 '
    '3.57826E+01 '
    '0.00000E+00 '
    '0.00000E+00'
    ' 0.00000E+00'
    '0.00000E+00 '
    '0.00000E+00 '
    '0.00000E+00 '
    '0.00000E+00 '
    '0.00000E+00'
    ' 0.00000E+00'
    ...

ファイルの読み取りを終了する

4

1 に答える 1

0

正規表現を使用してトークン化できます。このソリューションは動的配列を使用するため、大きなファイルを読み込む場合は、事前に割り当てられた行数をアプリオリに取得する必要があります。最もエレガントではありませんが、機能します。

fid = fopen('file.txt','r');

line = fgetl(fid); % ignore first line
l=1;
done = false;
 while ~done
    line = fgetl(fid); 
    if line ~= -1 %empty line is returned
       [s,e] = regexp(line, '-?[0-9]+\.[0-9]+E[+-][0-9]+','start','end'); %not sure why tokens aren't working
       for i=1:numel(s)
          data(l,i) = str2double(line(s(i):e(i))); %grab the ith match between start and end
       end
        l=l+1;
    else
        done = true;
    end
 end

 data

出力:

>> test

data =

         0   47.8181  -47.6356    0.3763         0    1.5924
    1.8817    0.0000         0   35.7826         0         0
         0         0         0         0         0         0
         0    0.0000         0         0         0         0
         0         0         0         0         0         0
         0         0         0         0         0         0
         0         0         0   32.8103         0         0
         0         0         0         0         0         0
         0         0         0         0         0         0
         0         0         0         0         0         0
于 2012-04-26T21:19:19.357 に答える