3

次の形式のセミコロン区切りのファイルがあります。

Press;Temp.;CondF;Cond20;O2%;O2ppm;pH;NO3;Chl(a);PhycoEr;PhycoCy;PAR;DATE;TIME;excel.date;date.time
0.96;20.011;432.1;431.9;125.1;11.34;8.999;134;9.2;2.53;1.85;16.302;08.06.2011;12:01:52;40702;40702.0.5
1;20.011;433;432.8;125;11.34;9;133.7;8.19;3.32;2.02;17.06;08.06.2011;12:01:54;40702;40702.0.5
1.1;20.012;432.7;432.4;125.1;11.34;9;133.8;8.35;2.13;2.2;19.007;08.06.2011;12:01:55;40702;40702.0.5
1.2;20.012;432.8;432.5;125.2;11.35;9.001;133.8;8.45;2.95;1.95;21.054;08.06.2011;12:01:56;40702;40702.0.5
1.3;20.012;432.7;432.4;125.4;11.37;9.002;133.7;8.62;3.17;1.87;22.934;08.06.2011;12:01:57;40702;40702.0.5
1.4;20.007;432.1;431.9;125.2;11.35;9.003;133.7;9.48;4.17;1.6;24.828;08.06.2011;12:01:58;40702;40702.0.5

これをmatlabの行列に解析するにはどうすればよいですか? 最初の行は気にしませんが、マトリックスの残りの行が必要です。double に変換する必要はありません。行列は文字列で構成できます。ファイルには、行の終わりを表す新しい行があります。新しい行の前にセミコロンはありません。

助けてくれてありがとう。

4

3 に答える 3

3

データを読み取るには、次のコードを検討してください。

fid = fopen('file.txt','rt');
frmt = [repmat('%f ',1,12) '%s %s %f %s'];
C = textscan(fid, frmt, 'Delimiter',';', 'CollectOutput',true, 'HeaderLines',1);
fclose(fid);

最初に変数Cにさまざまなコンポーネントを読み込みます。最初の 12 列は数値として、次の 2 列は文字列として (次のステップでシリアル日付番号に変換します)、別の数値列、最後に文字列列です。

>> C
C = 
    [6x12 double]    {6x2 cell}    [6x1 double]    {6x1 cell}

前述したように、解析C{2}してシリアル日付に変換できます。

dt = datenum(strcat(C{2}(:,1),{' '},C{2}(:,2)), 'dd.mm.yyyy HH:MM:ss');

これで、それらすべてをテーブルとしてセル配列にマージできます。最後の列はまだ文字列であるため、数値行列の代わりにセル配列を使用します。

>> data = [num2cell([C{1} dt C{3}]) C{4}]

data = 
  Columns 1 through 7
    [0.96]    [20.011]    [432.1]    [431.9]    [125.1]    [11.34]    [8.999]
    [   1]    [20.011]    [  433]    [432.8]    [  125]    [11.34]    [    9]
    [ 1.1]    [20.012]    [432.7]    [432.4]    [125.1]    [11.34]    [    9]
    [ 1.2]    [20.012]    [432.8]    [432.5]    [125.2]    [11.35]    [9.001]
    [ 1.3]    [20.012]    [432.7]    [432.4]    [125.4]    [11.37]    [9.002]
    [ 1.4]    [20.007]    [432.1]    [431.9]    [125.2]    [11.35]    [9.003]
  Columns 8 through 14
    [  134]    [ 9.2]    [2.53]    [1.85]    [16.302]    [7.3466e+05]    [40702]
    [133.7]    [8.19]    [3.32]    [2.02]    [ 17.06]    [7.3466e+05]    [40702]
    [133.8]    [8.35]    [2.13]    [ 2.2]    [19.007]    [7.3466e+05]    [40702]
    [133.8]    [8.45]    [2.95]    [1.95]    [21.054]    [7.3466e+05]    [40702]
    [133.7]    [8.62]    [3.17]    [1.87]    [22.934]    [7.3466e+05]    [40702]
    [133.7]    [9.48]    [4.17]    [ 1.6]    [24.828]    [7.3466e+05]    [40702]
  Column 15
    '40702.0.5'
    '40702.0.5'
    '40702.0.5'
    '40702.0.5'
    '40702.0.5'
    '40702.0.5'
于 2012-07-11T13:26:44.247 に答える
2

これには textscan を使用できます。

 fid = fopen('data.txt'); %open file
 headers = fgetl(fid);    %get first line
 headers = textscan(headers,'%s','delimiter',';'); %read first line
 format = repmat('%s',1,size(headers{1,1},1)); %count columns and make format string
 data = textscan(fid,format,'delimiter',';'); %read rest of the file
 data = [data{:}];
于 2012-07-11T07:11:23.987 に答える
1

夕方最大。

ファイルからデータをインポートするか、それ以外の方法で Matlab にデータを取得できることを前提としています。このようなデータに対して私が通常使用する方法では、データはセルの列マトリックスのままになります。各セルには、ファイルからのデータ行が含まれます。

次に、セルを文字のマトリックスに変換し、正規表現を使用してそのデータを解析し、一番上の行がヘッダー データである使いやすいマトリックスに変換できます。

行き詰まった場合は、いくつかのコードを投稿してください。それを処理できます。

乾杯!

アップデート:

これが私が話していたコードです。

A = importdata('filepath\sample.txt') %This uses the newline on each line to make a new row.
B= [];
for(n = 1:size(A,1))
    B = [B;regexp(cell2mat(A(n)),';','split')]; %This uses the ; to split the string
end

Matlab のインデックス作成は、常に (行、列) 形式で行われます。したがって、matrix(2,3) のようなものは、行 2、列 3 の位置でアイテムを呼び出します。Matlab は、他の多くの言語のように 0 ではなく、常に 1 からインデックスを付けます。

1 つの行または 1 つの列 (一般にベクトルと呼ばれる) がある場合は、matrix(4) を呼び出すだけで、4 番目の要素が返されます。必要に応じて、マトリックスに 3 つ以上のレイヤーを含めることもできます。必要に応じて、行列の行列を考えてください。

可変長データを 1 つの場所に格納する場合、セルは非常に便利です。データがセルに格納されている場合でも、マトリックスと同じ方法で呼び出されますが、用途によってはセル タイプからマトリックス (cell2mat) に変換する必要があります。これらはすぐに習得できます。cell2num など、セルから変換する方法は他にもあります。

それがもう少し役立つことを願っています!

于 2012-07-11T02:42:24.733 に答える