MATLAB Answers

0

how to read complicated text file

Asked by Michal Kvasnicka on 19 Sep 2013
Hello,
How to read the following "complicated" text file via textscan?
see attached file.dat:
name | multiplicity | pos | rot | excore
------------------------------------------------
a | 2 | 2 3 | 1 | 1
b | 1 | 1 2 3 | 6 | 1
c | 2 | 1 | 6 | 0
...
------------------------------------------------
The number of rows is uknown. The number of integers at column "pos" is variable.

  0 Comments

Sign in to comment.

Tags

Products

3 Answers

Answer by Simon
on 19 Sep 2013
 Accepted Answer

try this
% read file with 5 columns and delimiter '|'
fid = fopen('readin.txt');
FC = textscan(fid, '%s %s %s %s %s', 'delimiter', '|');
fclose(fid);
% postprocessing
% remove blanks from string column
FC(1) = strtrim(FC(1));
% convert numeric columns
for n = 2:5
FC{n} = cellfun(@(x) str2num(x), FC{n}, 'UniformOutput', false);
end
name = FC{1};
multiplicity = cell2mat(FC{2});
pos = FC{3};
rot = cell2mat(FC{4});
excore = cell2mat(FC{5});

  3 Comments

Great! Thanks Simon
Could be possible to create output variables names from 1st row of text file, too?
Simon
on 20 Sep 2013
If the first row is always the header, no problem:
% read file with 5 columns and delimiter '|'
fid = fopen('readin.txt');
FC = textscan(fid, '%s %s %s %s %s', 'delimiter', '|');
fclose(fid);
% get header
Header = cellfun(@(x) x(1), FC);
% remove header from file contents
FC = cellfun(@(x) x(2:end), FC, 'UniformOutput', false);
% postprocessing
% remove blanks from string column
FC(1) = strtrim(FC(1));
% convert numeric columns
for n = 2:5
FC{n} = cellfun(@(x) str2num(x), FC{n}, 'UniformOutput', false);
end
F1 = FC{1};
F2 = cell2mat(FC{2});
F3 = FC{3};
F4 = cell2mat(FC{4});
F5 = cell2mat(FC{5});
for n = 1:5
eval(sprintf('%s = F%d;', Header{n}, n));
clear(sprintf('F%d', n));
end

Sign in to comment.


Answer by ES
on 19 Sep 2013

use textscan with delimiter '|'
FileObj=fopen(FileName);
CellData=textscan(FileObj, ...
'%s %s %s %s %s %s %s %s %s', 'delimiter', '|');

  1 Comment

The number of rows is uknown!!! So, number of "%s" is not possible to set in advance.

Sign in to comment.


Answer by Azzi Abdelmalek
on 19 Sep 2013
Edited by Azzi Abdelmalek
on 19 Sep 2013

Use fgetl to read your file then parse the result
fid = fopen('file.txt');
line1 = fgetl(fid);
res={line1};
while ischar(line1)
line1 = fgetl(fid);
res{end+1} =line1
end
fclose(fid);
res(end)=[]

  1 Comment

Thanks, but the parsing of res cell in this method is very painfull :) So, what I neeed is exactly as follows:
after reading the file I need the following outputs:
name = {'a','b','c'}
multiplicity = [2 1 2]
pos = {[2 3], [1 2 3], [1]}
rot = [1 6 6]
excore = [1 1 0 ]

Sign in to comment.