2

.txt ファイルを Matlab に読み込みたいと思います。列の 1 つに、文字と数字の両方が含まれています。(したがって、この列を文字列として読み取るのも 1 つの方法だと思います。)

問題は、その列内で 5 より大きい数値も見つける必要があることです。

たとえば、.txt は次のようになります。

12 1
21 2
32 7
11 a
03 b
22 4
13 5
31 6

つまり、最終的には、取得したい

32 7
31 6

どうすれば入手できますか?? 専門家の方、助けてください!

4

2 に答える 2

4

TEXTSCANを使用してファイルの内容を文字列のセル配列に読み取り、 CELLFUNおよびSTR2NUMを使用して文字列を数値に変換し(のよ​​うな文字'a''b'、空の行列になります[])、空のセルがあるセル配列の行を削除できます。それらの中で、 CELL2MATを使用して残りのデータをN行2列の行列に変換します。

fid = fopen('junk.txt','r');                        %# Open the file
data = textscan(fid,'%s %s','CollectOutput',true);  %# Read the data as strings
fclose(fid);                                        %# Close the file
data = cellfun(@str2num,data{1},'UniformOutput',false);  %# Convert to numbers
data(any(cellfun('isempty',data),2),:) = [];        %# Remove empty cells
data = cell2mat(data);                              %# Convert to N-by-2 array

質問のサンプルファイルを考えると、マトリックスは次のdataようになります。

>> data

data =

    12     1
    21     2
    32     7
    22     4
    13     5
    31     6

そして、次のように2番目の列で5より大きい値を持つ行を取得できます。

>> data(data(:,2) > 5,:)

ans =

    32     7
    31     6
于 2011-06-03T21:27:48.983 に答える
0
fid = fopen('txt.txt','r');  

Aout = []; 

while(1)    
    [a1,count1] = fscanf(fid,'%s',1);
    [a2,count2] = fscanf(fid,'%s',1);
    if(count1 < 1 | count2 < 1)
        break;    
    end
    if(~isempty(str2num(a2)) & str2num(a2) > 5 & (~isempty(str2num(a1))) )
        Aout = [ Aout ; str2num(a1) str2num(a2) ];   
    end
end

fclose(fid);

ループ中にMatlab変数を拡張するという暗黙のルールに違反しますが、とにかくテキスト処理であるため、速度の低下に気付かない可能性があります。

編集:以前のバージョンではエラーが多すぎたため、最初からやり直す必要がありました。

于 2011-06-03T21:21:12.537 に答える