user2707748
user2707748

Reputation: 67

Matlab Code for Reading Text file with inconsistent rows

I am new to Matlab and have been working my way through using Google. But now I have hit the wall it seems.

I have a text file which looks like following:

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

I want to extract following information in a cell/matrix format so that I can use it later to selectively do operations like average of accounts A1 and A2 or average of PA and A1, etc.

PA  -0.8
A1  -0.84
A2  -0.036

Upvotes: 0

Views: 203

Answers (2)

Dennis Jaheruddin
Dennis Jaheruddin

Reputation: 21563

Matlab is not that nice when it comes to dealing with messy data. You may want to preprocess it a bit first.

However, here is an easy general way to import mixed numeric and non-numeric data in Matlab for a limited number of normal sized files.

Step 1: Copy the contents of the file into excel and save it as xls or xlsx Step 2: Use xlsread

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

From there the parsing should be maneagable.

Hopefully they will add non-numeric support to csvread or dlmread in the future.

Upvotes: 1

fpe
fpe

Reputation: 2750

I'd go this way:

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

This way you'll get all the numerical values after a string 'Total Period' in a matrix, so that you may pick the values you need.

Similarly you may operate with strings PA, A1 and A2.

Upvotes: 1

Related Questions