我有一个以分号分隔的文件,格式如下:
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中将其解析为矩阵?我不关心第一行,但我想要矩阵中的其余行。它们不需要转换成双打,矩阵可以由字符串组成。文件中有新行,表示行的结尾。新行之前没有分号。
感谢您的帮助。
答案 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。
希望能有所帮助!