MATLAB Answers

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

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

Michal Kvasnicka on 19 Sep 2013

Great! Thanks Simon

Michal Kvasnicka on 19 Sep 2013

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

Answer by Chocolate Warrior 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

Michal Kvasnicka on 19 Sep 2013

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


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

Michal Kvasnicka on 19 Sep 2013

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 ]


Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply today