用于读取具有不一致行的文本文件的Matlab代码

时间:2013-08-22 14:40:39

标签: matlab

我是Matlab的新手,并一直在努力使用Google。但现在我似乎已经碰壁了。

我有一个文本文件,如下所示:

Information is for illustration reasons only
Aggregated Results
Date;$/Val1;Total $;Exp. Val1;Act. Val1
01-Oct-2008; -5.20;   -1717;     330;     323
02-Oct-2008; -1.79;    -595;     333;     324
03-Oct-2008; -2.29;    -765;     334;     321
04-Oct-2008; -2.74;    -917;     335;     317
Total Period; -0.80;   -8612;   10748;   10276


Aggregated Results for location State PA
Date;$/Val1;Total $;Exp. Val1;Act. Val1
01-Oct-2008; -5.20;   -1717;     330;     323
02-Oct-2008; -1.79;    -595;     333;     324
03-Oct-2008; -2.29;    -765;     334;     321
Total Period; -0.80;   -8612;   10748;   10276


Results for account A1
Date;$/Val1;Total $;Exp. Val1;Act. Val1
01-Oct-2008; -7.59;    -372;      49;      51
Total Period; -0.84;   -1262;    1502;    1431


Results for account A2
Date;$/MWh;Total $;Exp. MWh;Act. MWh
01-Oct-2008; -8.00;    -392;      49;      51
02-Oct-2008;  0.96;      47;      49;      51
03-Oct-2008; -0.75;     -37;      50;      48
04-Oct-2008;  1.28;      53;      41;      40
Total Period; -0.36;    -534;    1502;    1431

我想以单元格/矩阵格式提取以下信息,以便我以后可以选择使用它来选择性地执行帐户A1和A2的平均值或PA和A1的平均值等操作。

PA  -0.8
A1  -0.84
A2  -0.036

2 个答案:

答案 0 :(得分:1)

我会这样:

fid = fopen(filename,'r');
A = textscan(fid,'%s','delimiter','\r');
A = A{:};
str_i = 'Total Period';
ix = find(strncmp(A,str_i,length(str_i)));
res = arrayfun(@(i) str2num(A{ix(i)}(length(str_i)+2:end)),1:numel(ix),'UniformOutput',false);
res = cat(2,res{:});

这样,您将获得矩阵中字符串“总周期”后的所有数值,以便您可以选择所需的值。

同样,您可以使用字符串PAA1A2进行操作。

答案 1 :(得分:1)

在处理凌乱的数据时,Matlab并不是那么好。您可能希望先对它进行预处理。

但是,这是一种简单的通用方法,可以在Matlab中为有限数量的正常大小的文件导入混合数字和非数字数据。

步骤1:将文件内容复制到excel中并将其另存为xls或xlsx 第2步:使用xlsread

[NUM,TXT,RAW]=xlsread('test.xlsx')

从那里解析应该是可以解决的。

希望他们将来会向csvreaddlmread添加非数字支持。