My apologies. I did not upload the correct file in the first time. Updated is the right txt file. Also could anybody help me how to extract only the numerical data portion from the file excluding all the text.
reading and processing text file
2 次查看(过去 30 天)
显示 更早的评论
Hi,
This probably a simple question for the expert but I am swamped by the too many options. I have a text file (a sample is attached here). The file starts with header where the first line is named as structure and this line is followed by few more text lines and then three columns header and the data. After this data, another line (named as structure) starts and the same continues for couple of more structures. I want to read this file and write it as excel file where each structure start firsts and read data and then the next structure starts in parallel with first one. I have shown it in the excell file attached here. Since there are so many data and couple of structures it would be great if I can write a code. I vastly appreciate any help. I already tried with textscan but could not get it working.
采纳的回答
Guillaume
2014-10-11
编辑:Guillaume
2014-10-11
While it's certainly possible to read it the file in matlab and write it to excel the way you want, if it's the only thing you do I don't see the point.
Just open the text file in excel and the importer will do exactly what you want.
Now, if you do insist on doing it matlab:
excel = actxserver('Excel.Application');
wb = excel.Workbooks.OpenText('test_rafiq.txt'); Just call excel text importer with default values
wb.SaveAs('test_rafiq.xlsx');
wb.Close;
excel.Quit;
delete(excel);
4 个评论
Guillaume
2014-10-11
Right, it's a lot more complicated. I would read the file fgetl, parse it using regexp and save the result into two cell arrays (one for the structures, one for the data) that expand as appropriate. You then just merge the cell arrays and write the whole lot to excel.
Try this:
fid = fopen('test_rafiq.txt', 'rt');
instruct = false;
indata = false;
structs = {};
scount = -2; %start at -2 so first iteration puts it at 1
srow = 0;
data = {};
dcount = -3; %start at -3 so first iteration puts it at 1
drow = 0;
line = fgetl(fid);
while ischar(line)
if isempty(line)
instruct = false;
indata = false;
elseif instruct
structs(srow, scount:scount+1) = regexp(line, '(.*:)\s+(.*)', 'tokens', 'once');
srow = srow+1;
elseif indata
data(drow, dcount:dcount+2) = regexp(line, '\S+', 'match');
drow = drow+1;
elseif strfind(line, 'Structure:')
scount = scount + 3;
structs(1, scount:scount+1) = regexp(line, '(.*:)\s+(.*)', 'tokens', 'once');
srow = 2;
instruct = true;
else
%assume it's a 'Dose ...' line
dcount = dcount + 4;
data(1, dcount:dcount+2) = regexp(line, '\S.*?\[.*?]', 'match');
drow = 2;
indata = true;
end
line = fgetl(fid);
end
fclose(fid);
%make both cell arrays the same number of columns
if size(structs, 2) < size(data, 2)
structs{1, size(data, 2)} = [];
elseif size(data, 2) < size(structs, 2)
data{1, size(structs, 2)} = [];
end
xlswrite(fullfile(pwd, 'test_rafiq.xlsx'), [structs; data]);
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Spreadsheets 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!