2012-07-11 90 views
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矩阵?我不关心第一行,但我想要矩阵中的其余行。他们不需要转换成双打,矩阵可以由字符串组成。文件中有新行,代表行的末尾。新行之前没有分号。

感谢您的帮助。

回答

1

晚上最大。

我打算假设您已经能够从文件导入数据或以其他方式将其导入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列的位置调用一个项目.MFC也总是从1开始索引,而不是像其他许多语言那样索引。

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

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

希望有助于更多!

+0

只是说明一下,这可能不是最好的做法,但不是我的头顶,它应该让你开始在路上。 – 2012-07-11 02:43:47

+0

我实际上是在寻找一些matlab代码。我可以在许多其他语言中解决这个问题,但是我发现编写matlab代码非常困难。我现在正在做的研究是我对matlab的第一次经历。什么是单元列矩阵(什么是单元?)的语法,以及如何实际使用正则表达式。在我看来,matlab的文档过于冗长,从来没有阐明解决常见问题的正确方法。感谢您的帮助。 – Max 2012-07-11 02:57:32

+0

更新了一个简短的例子和一些额外的信息给你。 – 2012-07-11 11:54:16

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{:}]; 
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'