我该如何解析这个以分号分隔的文件?

时间:2012-07-11 01:38:55

标签: matlab file-io

我有一个以分号分隔的文件,格式如下:

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

感谢您的帮助。

3 个答案:

答案 0 :(得分: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列作为数字,接下来的两列作为字符串(我们将它们转换为下一步中的序列日期数字),另一个数字列,最后一个字符串:

>> 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'

答案 1 :(得分: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{:}];

答案 2 :(得分:1)

Evening Max。

我将假设您已经能够从文件导入数据或以其他方式将其导入Matlab。我通常用于这样的数据的方法将其留在单元格的列矩阵中。然后,每个单元格都包含文件中的一行数据。

然后,您可以将单元格转换为字符矩阵,并使用regexp将该数据解析为更易于使用的矩阵,其中顶行是您的标题数据。

如果你遇到困难,只需发布​​一些代码,我们就可以解决它。

干杯!

更新

这是我正在谈论的代码。

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索引始终以(行,列)格式完成。因此像矩阵(2,3)这样的东西会在第2行第3列的位置调用一个项目.Matlab也总是从1开始索引,而不是像其他许多语言中那样的索引。

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

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

希望能有所帮助!