extract from text file
2 views (last 30 days)
Show older comments
Hi, I am trying to use Matlab for this because I have ~300 files for which this needs to be done..
The data in the .txt file looks like this:
Event List
Patient Name: xyz Export Time: Thursday, April 11, 2013, 15:25:00 User Name: xyz Test ID: Name Time Duration Exam Start 00:00:00 00:00 Impedance - Impedance Values 00:00:00 00:00 Change - Montage Apply: 0bical.mtg 00:00:17 00:00 Calibration Off 00:00:18 00:00 Change - Montage Apply: 1doublebanana.mtg 00:00:36 00:00 . . .
I need a matrix file with 3 columns like this 00:00:00 00:00:00 Exam Start 00:00:00 00:00:00 Impedance - Impedance Values
i.e. 1) discard the first 7 lines.. 2) text goes into column 3 3) First values after text go into column 1 3) Second value + first value go into column 2
Is this possible?
Thanks, S
1 Comment
Cedric
on 25 Apr 2013
You seem to be saying that your data is not available in column (i.e. it is a stream of characters) but then you say that the first 7 lines have to be discarded, which seems to indicate that there is some structure.
Reading
Patient Name: xyz Export Time: Thursday, April 11, 2013, 15:25:00 User Name: xyz Test ID: Name Time Duration Exam Start 00:00:00 00:00 Impedance - Impedance Values 00:00:00 00:00 Change - Montage Apply: 0bical.mtg 00:00:17 00:00 Calibration Off 00:00:18 00:00 Change - Montage Apply: 1doublebanana.mtg 00:00:36 00:00...
doesn't really allow me to determine what you call "text", or columns 1, 2, 3. Could you be more specific or reformat the question using "code" formatting?
There are several options for extracting data from a text file, ranging from TEXTREAD/SCAN, STRFIND, etc, for formatted enough content, to regular expressions for pattern matching in more complicated or less formatted content. Once you refine the question, we can talk about an appropriate approach.
Accepted Answer
Cedric
on 25 Apr 2013
Edited: Cedric
on 25 Apr 2013
New version, taking into account your last comment.
fname_in = 'myFile.txt' ;
fname_out = 'myFile.xlsx' ;
headerSize = 8 ;
fid = fopen(fname_in, 'r') ;
% - Discard header.
for k = 1 : headerSize
if feof(fid)
error('Structure discrepancy in %s', fname_in) ;
end
fgetl(fid) ;
end
% - Extract/process content.
buffer = cell(1e6, 3) ; % Cheap prealloc..
lineCnt = 0 ;
while ~feof(fid)
lineCnt = lineCnt + 1 ;
line = fgetl(fid) ;
lStr = line(1:end-15) ; % Label string.
dStr = line(end-13:end-6) ; % Date string.
tStr= line(end-4:end) ; % Time string.
fprintf('|%s|%s|%s|\n', dStr, tStr, lStr) ; % Just for testing.
buffer(lineCnt, :) = {dStr, tStr, lStr} ;
end
fclose(fid) ;
buffer = buffer(1:lineCnt,:) ; % Truncate prealloc.
% - Export to XLSX.
xlswrite(fname_out, buffer) ;
You might want to improve the prealloc, adding blocks of cells when/if the initial size is too small. Note that this solution assumes the time stamp (date, time) to have always the same structure.
5 Comments
Cedric
on 26 Apr 2013
Edited: Cedric
on 26 Apr 2013
If you look for "MATLAB Excel Mac" online, you'll see that managing Excel files on Macs has not been working until very recently. I think that your best option is to export to CSV if you want a format that can be read by Excel.
CSVREAD and DLMREAD won't manage text content though, so you can't use them to build the CSV file. One option is to implement the export in the loop that we just built (avoid at the same time the burden to build the cell array):
fname_in = 'myFile.txt' ;
fname_out = 'myFile_out.csv' ;
headerSize = 8 ;
fid_in = fopen(fname_in, 'r') ;
% - Discard header.
for k = 1 : headerSize
if feof(fid_in)
error('Structure discrepancy in %s', fname_in) ;
end
fgetl(fid_in) ;
end
% - Extract/process content and output CSV content.
fid_out = fopen(fname_out, 'w') ;
while ~feof(fid_in)
line = fgetl(fid_in) ;
lStr = line(1:end-15) ; % Label string.
dStr = line(end-13:end-6) ; % Date string.
tStr= line(end-4:end) ; % Time string.
fprintf('|%s|%s|%s|\n', dStr, tStr, lStr) ; % Just for testing.
fprintf(fid_out, '%s,%s,%s\n', dStr, tStr, lStr) ;
end
fclose(fid_in) ;
fclose(fid_out) ;
More Answers (3)
sas0701
on 25 Apr 2013
Edited: sas0701
on 25 Apr 2013
2 Comments
Matt Kindig
on 25 Apr 2013
Edited: Matt Kindig
on 25 Apr 2013
Can you also post your intended output, i.e., what data after the 8th line that you want to retain, how you want to be structured, etc.? Your goal is still a bit unclear.
Cedric
on 25 Apr 2013
After the 8th line, you have multiple blocks of
Exam Start 00:00:00 00:00
Impedance - Impedance Values 00:00:00 00:00
Change - Montage Apply: 0bical.mtg 00:00:23 00:00
Calibration Off 00:00:26 00:00
that you want to transpose into a structure that has one row per block?
D. Ali
on 27 Apr 2019
I have similar question where I need to extarct all MCAP with time they occured on in separat file and plot if possilbe
I attached the file
2 Comments
D. Ali
on 27 Apr 2019
I did post two threads with the question but didn't get answers so I am trying to get answers from similar threads
See Also
Categories
Find more on Language Support in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!