extract from text file
2 次查看(过去 30 天)
显示 更早的评论
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 个评论
Cedric
2013-4-25
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.
采纳的回答
Cedric
2013-4-25
编辑:Cedric
2013-4-25
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 个评论
Cedric
2013-4-26
编辑:Cedric
2013-4-26
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) ;
更多回答(3 个)
sas0701
2013-4-25
编辑:sas0701
2013-4-25
2 个评论
Matt Kindig
2013-4-25
编辑:Matt Kindig
2013-4-25
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
2013-4-25
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?
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Language Support 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!