Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read txt file in Matlab

I have a trouble reading the txt file, which contains 10 columns and 2 lines of header, but the problem is that in the middle of the file the same header appears several times and textread() doesnt function. That's my file example:

file.txt

headerline1 aaaa
headerline2 111 123
20/12/2000 name1 name2 name3... name8 0
21/12/2000 name1 name2 name3... name8 0
22/12/2000 name1 name2 name3... name8 0
headerline1 aaaa
headerline2 111 123
25/12/2000 name1 name2 name3... name8 0
27/12/2000 name1 name2 name3... name8 0
...

and this is my code I tried:

[date, name1, name2, name3, name4, name5, name6, name7, name8, status] = ...
    textread('file.txt', '%s %s %s %s %s %s %s %s %s %d', 'headerlines',2);

It gives the error exactly at the row with the repeated header. Do you have any ideas how could I avoid those headers and read the complete file? The problem is that I have hundreds of these types of files, so I cant delete each time manually.

Thanks for help.

like image 322
Mallvina Avatar asked Feb 08 '12 14:02

Mallvina


2 Answers

You can first read the file line by line with textscan taking the whole line as a string. Then remove the headerlines, and process the rest

Here is an example:

%# read the whole file to a temporary cell array
fid = fopen(filename,'rt');
tmp = textscan(fid,'%s','Delimiter','\n');
fclose(fid);

%# remove the lines starting with headerline
tmp = tmp{1};
idx = cellfun(@(x) strcmp(x(1:10),'headerline'), tmp);
tmp(idx) = [];

%# split and concatenate the rest
result = regexp(tmp,' ','split');
result = cat(1,result{:});

%# delete temporary array (if you want)
clear tmp
like image 146
yuk Avatar answered Oct 15 '22 19:10

yuk


If you do NOT want to use perl, awk or something like it to preprocess your data (which I actually could really understand), you could try to read your file line by line by using fopen, fgetl and feof (e.g. one example can be seen here: https://stackoverflow.com/a/2858208/701049) and check for each line if it contains a header. If so, continue your loop. If not, process it by using something like textscan as you do now already.

like image 44
tim Avatar answered Oct 15 '22 21:10

tim