how to read complicated text file

1 Ansicht (letzte 30 Tage)
Michal Kvasnicka
Michal Kvasnicka am 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.

Akzeptierte Antwort

Simon
Simon am 19 Sep. 2013
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 Kommentare
Michal Kvasnicka
Michal Kvasnicka am 19 Sep. 2013
Bearbeitet: Michal Kvasnicka am 19 Sep. 2013
Could be possible to create output variables names from 1st row of text file, too?
Simon
Simon am 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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

ES
ES am 19 Sep. 2013
use textscan with delimiter '|'
FileObj=fopen(FileName);
CellData=textscan(FileObj, ...
'%s %s %s %s %s %s %s %s %s', 'delimiter', '|');
  1 Kommentar
Michal Kvasnicka
Michal Kvasnicka am 19 Sep. 2013
The number of rows is uknown!!! So, number of "%s" is not possible to set in advance.

Melden Sie sich an, um zu kommentieren.


Azzi Abdelmalek
Azzi Abdelmalek am 19 Sep. 2013
Bearbeitet: Azzi Abdelmalek am 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 Kommentar
Michal Kvasnicka
Michal Kvasnicka am 19 Sep. 2013
Bearbeitet: Michal Kvasnicka am 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 ]

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Data Type Conversion finden Sie in Help Center und File Exchange

Tags

Produkte

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by