1

textscan を使用して、テキスト ファイルから固定幅 (9 文字) のデータを読み取っています。次の文字列を含む特定の行で Textscan が失敗します。

'   9574865.0E+10  '

これから2つの数字を読みたい:

957486 5.0E+10

問題は次のように再現できます。

dat = textscan('   9574865.0E+10  ','%9f %9f','Delimiter','','CollectOutput',true,'ReturnOnError',false);

次のエラーが返されます。

Error using textscan
Mismatch between file and format string.
Trouble reading floating point number from file (row 1u, field 2u) ==> E+10

驚いたことに、マイナスを追加すると、エラーにはなりませんが、間違った結果が得られます。

dat = textscan('  -9574865.0E+10  ','%9f %9f','Delimiter','','CollectOutput',true,'ReturnOnError',false);

現在、データ{1}は次のとおりです。

    -9574865           0

明らかに、両方のケースが機能する必要があります。私の現在の回避策は、フィールド間にコンマを追加し、テキストスキャンでコンマを区切り文字として使用することですが、それは遅く、良い解決策ではありません。textscan または別の組み込みの (パフォーマンス上の理由から) MATLAB 関数を使用して、この文字列を正しく読み取る方法はありますか?

4

2 に答える 2

0

textscan 最初に先頭の空白をトリミングしてから、フォーマット文字列解析していると思われます。フォーマット文字列をから変更すると、これだと思います

'%9f%9f'

'%6f%9f'

あなたのワンライナーが突然機能します。また、試してみると

'%9s%9s'

最初の文字列の先頭の空白が削除されている (したがって 3 文字が「多すぎる」) ことがわかりますが、何らかの理由で最後の文字列の末尾の空白が保持されます。

明らかに、これは、両方の数字が何桁になるかを正確に知る必要があることを意味します。これは望ましくないと思います。

回避策としては、次のようなものがあります。

% Split string on the "dot"
dat = textscan(<your data>,'%9s%9s',...
    'Delimiter'     , '.',...
    'CollectOutput' , true,...
    'ReturnOnError' , false);

% Correct the strings; move the last digit of the first string to the 
% front of the second string, and put the dot back
dat = cellfun(@(x,y) str2double({y(1:end-1),  [y(end) '.' x]}),  dat{1}(:,2), dat{1}(:,1), 'UniformOutput', false);

% Cast to regular array
dat  = cat(1, dat{:})
于 2013-06-19T09:26:21.220 に答える