0

.txtは、各行を私が気にしない可変長の文字列で始まり、その後にスペースで区切られたIDが続きます。

somegarbage 34532 2034 203 4 30403


garbage 2 45 2342 23 33503434
garbagethird 2 

2行目と3行目は空です。

データファイルの1行にあるすべてのIDは

  1. 数学的なセットにプッシュされます(つまり、要素の順序が重要ではない{。})
  2. V[linenumber]に割り当てられます。

読み込み後のクエリの例:

V[5]
  -> {2}
V[2]
  -> {}

どのような関数とデータ構造が必要ですか?

MATLABに設定されたデータ構造がない場合、近いものはありますか、それとも2次元配列に頼る必要がありますか?

4

2 に答える 2

1

データで何をしようとしているのかによっては、これがアプローチになる可能性があります。

V=importdata('A.txt')
V = 

      data: [2x6 double]
  textdata: {2x1 cell}
rowheaders: {2x1 cell}

Vは、すべての「ID」を含むフィールドデータを持つ構造体になります。次に、使用V.data(linenumber,:)して、混乱させたい行を取得できます。

V.data(1,:)
ans =

   34532        2034         203           4       30403        3333

また、行の長さが等しくない場合があります。

V.data(2,:)

ans =

       2          45        2342          23    33503434         NaN

改善されたソリューション:

fid = fopen('A.txt');
tline = fgets(fid);
counter=1;
while ischar(tline)
v{counter} = strread(char(tline),'%s','delimiter',' ');
if ~isempty(v{counter})
    v{counter}=v{counter}(2:end);
else
    v{counter}={};
end
tline = fgets(fid);
V{counter}=cellfun(@str2double, v{counter}');
counter=counter+1;
end
fclose(fid);

このソリューションは空の行を保持します。

V{1}

ans =

   34532        2034         203           4       30403

V{2}

ans =

 []
于 2012-12-02T05:35:51.283 に答える
1

この目的に適した2つの関数があります:textreadtextscan。どちらも、入力テキストファイルの各行のパラメータのパターンを指定するフォーマット文字列を受け取ります。

解決策textread

textread各行で読み取られるパラメーターの数と一致する出力変数の数が必要なので、これらの行に沿って何かを行うことができます。

[col1, col2, col3, col4, col5, col6] = textread('myfile.txt', '%s %d %d %d %d');
V = [col2, col3, col4, col5, col6]

これにより、次のようになります。

V =
    34532        2034         203           4         30403
        2          45        2342          23      33503434

基本的に、あなたが持っているのは行列つまり配列の配列)であり、各行は入力テキストファイルの行に対応します。このような行の1つにアクセスするには、次のようV(row_index, :)にします。

V(1, :) =
    34532        2034         203           4         30403

解決策textscan

textscanファイルを手動で開く必要があります。セル配列(実際には、数値を含む文字列など、同じセット内の複数のタイプの変数を保持できる特殊なタイプの配列)を返します。と同じ行列を取得するにはtextread、次のように、コンマ区切りのリストと単純な連結を使用します。

fid = fopen('myfile.txt');
C = textscan(fid, '%s %d %d %d %d %d')
V = [C{2:6}]
fclose(fid);

Vこれで、最初の例と同じ要素を保持する必要があります。

解析されたパラメータの数が不明な場合は、行全体を文字列として読み取り、regexp代わりに次のように解析することをお勧めします。

fid = fopen('myfile.txt');
C = textscan(fid, '%s', 'Delimiter', '');
V = C{1};
for i = 1:numel(V)
    V{i} = cellfun(@str2num, regexp(V{i}, '\d*', 'match'));
end
fclose(fid);

この場合、出力Vセル配列になります(行列では、それぞれの要素の数を固定する必要があるため)。セル配列内の各セルは、おそらく異なる長さの数値の配列(つまりベクトル)になります。たとえば、結果は3行1列のセル配列になります(空の行は無視されます)。

V = 
    [34532        2034         203           4       30403]
    [    2          45        2342          23    33503434]
    [    2]

ここでは、中括弧({})を使用して各行の要素にアクセスできます。次に例を示しV{2}ます。

ans =
    [    2          45        2342          23    33503434]

アドバイス:フォーマットパターンと正規表現は文字列の解析を大幅に簡素化し、通常、MATLABでは、forループを使用してトークンを反復処理する簡単な方法よりも優先されます。また、ソリューションがよりエレガントになり、煩わしさが大幅に軽減されます。

于 2012-12-02T13:17:34.517 に答える