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 中将其解析为矩阵?我不关心第一行,但我想要矩阵中的其余行。它们不需要转换成双精度,矩阵可以由字符串组成。文件中有新行,代表一行的结束。新行之前没有分号。

谢谢您的帮助。

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:前十二列作为数字,接下来的两列作为字符串(我们将在下一步将它们转换为序列日期数字),另一个数字列,最后是字符串:

>> 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 也总是从 1 开始索引,而不是像许多其他语言那样从 0 开始。

如果您有单行或单列(通常称为向量),则只需调用 matrix(4) 并返回第 4 个元素。如果您愿意,您还可以在矩阵中添加 3 层或更多层。如果你愿意,可以考虑一个矩阵矩阵。

在将可变长度数据存储在单个位置时,单元格非常有用。当数据存储在单元格中时,它仍然以与矩阵相同的方式调用,但您必须将其从单元格类型转换为矩阵 (cell2mat) 以用于某些用途。你会很快学会这些。还有其他方法可以从单元格转换,例如 cell2num。

希望对您有所帮助!

于 2012-07-11T02:42:24.733 回答