I have a .dat file which has three columns of numbers (X,Y and Z). An example file is attached here. In the file there are some texts which prevents me from calling to matlab. In the beginning of the data, it is written "Measurement contains X,Y,Z)" and the next line "Injection #1"... after some rows of values it again says "Injection #2" .. again after some rows "Injection #3" so and so.... I want to eliminate these texts and call the whose rows in each column as X, Y and Z. Can anyone please tell me how to call the file and eliminate those texts in it?
PS: The attached one is just an example. In the real files, I have more than thousands of rows. So, impossible to delete manually.

댓글 수: 2

Cedric
Cedric 2013년 9월 19일
Does the file contain the first line "This measurement contains x,y and time" or is it something that you added? Do you need to read all data entries together or do you need to keep track of the injection number?
aneps
aneps 2013년 9월 19일
The file contains the text "This measurement contains x,y and time". An example file is attached with the question. Thank you.

댓글을 달려면 로그인하십시오.

 채택된 답변

Cedric
Cedric 2013년 9월 19일
편집: Cedric 2013년 9월 19일

5 개 추천

If the first line "This measurement contains x,y and time" is not present (if you added it for us to understand), you can do something as simple as:
buffer = fileread('Test.txt') ;
buffer = regexprep( buffer, 'i.*?\n', '\n') ;
buffer = textscan(buffer, '%f %f %f') ;
data = [buffer{:}] ;
Let me know if you have to eliminate the first line. We can replace FILEREAD with a few lines involving FOPEN/FGETL/FREAD, which skip the first line and read the rest of the file.
EDIT after your comment.
% - Read file, skip 1st line.
fid = fopen('Test.txt', 'r') ;
fgetl(fid) ; % Skip 1st line.
buffer = fread(fid, [1,Inf], '*char') ;
fclose(fid) ;
% - Eliminate 'injection' headers.
buffer = regexprep( buffer, 'i.*?\n', '\n') ;
% - Convert to numeric type.
data = textscan(buffer, '%f %f %f') ;
Then you can extract columns they way you need them.. you can build vectors x, y, t as follows:
x = data{1} ;
y = data{2} ;
t = data{3} ;
or, if you prefer, build a 3 columns array as follows
data = [data{:}] ;

댓글 수: 6

aneps
aneps 2013년 9월 19일
편집: aneps 2013년 9월 19일
The file contains the text "This measurement contains x,y and time". I need to eliminate that as well. An example file is attached with the question. Thank you.
Cedric
Cedric 2013년 9월 19일
See my edit.
aneps
aneps 2013년 9월 19일
Thanks a lot.
aneps
aneps 2014년 3월 18일
Hello, I am stuck with a few more things related to the same question. May I ask your help please? In the above question, how can I get the number of events (each x,y and time is an event, means each row is an event) after each 'injections'?
Cedric
Cedric 2014년 5월 6일
편집: Cedric 2014년 5월 6일
Hi Aneps, if you still have this question, please send me an email, or post a new question and send me a link by email so I see it.
Well, what about the following actually? Look at data and counts, they contain all injections data by block and counts of events.
content = fileread( 'Test.txt' ) ;
blocks = regexp( content, '#:\d+\s*([^i]+)', 'tokens' ) ;
data = cellfun( @(c) reshape(sscanf(c{1}, '%f'), 3, []).', blocks, ...
'UniformOutput', false ) ;
counts = cellfun( @(d) size(d, 1), data ) ;
Thanks a lot. I did program as you suggested, but it is not giving me what I am looking for. The first program you gave me is working wonderful, it reads the data the way I want and I made a long program from there
.
.
.
data = [data{:}] ;
I would like to add a few more lines to get more information. I have posted it as a new question (<http://www.mathworks.com/matlabcentral/answers/128448-counting-the-number-of-events-and-total-number-of-blocks-from-a-file)>. Thanks a lot.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Simulink에 대해 자세히 알아보기

태그

아직 태그를 입력하지 않았습니다.

질문:

2013년 9월 19일

댓글:

2014년 5월 6일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by