使用fscanf从matlab格式化读取

时间:2015-09-02 15:15:09

标签: string matlab file-io formatting scanf

我有一个以下格式的文本文件:

Row: 001, rank: 6, max: 0.2431, index: 15.

Row: 002, rank: 10, max: 0.2331, index: 1.

Row: 003, rank: 110, max: 0.2330, index: 10.

即,字段row用零填充,以便数字有三位数。字段max也被填充,因此它具有固定长度。 <{1}}和rank均未填充。

[编辑此帖后添加]此外,在数据之前有几行无关文本。无关文本的行数未知。当且仅当它在行index以下时,行格式如上所述。

有没有办法使用命令

读取文件

DATA START BELOW

[A, count] = fscanf(fid,['what is a proper format?'],[?, numberOfRows]); A = A';

这样B = A(:,[i,j,k,l]);

我知道的一种方法是B=[1,6,0.2431,15; 2,10,0.2331,1; 3,110,0.2330,10;];但是,当每个行追加新字段时,这种方法似乎缺乏灵活性。

2 个答案:

答案 0 :(得分:0)

这是一种方式:

s = importdata('file.txt'); %// read file as cell array of strings; one line per string
s = [s{:}]; %// concatenate into a single string
ind = regexp(s, 'DATA START BELOW', 'end'); %// locate line that marks start of data
s = s(ind+1:end); %// keep only data
s = regexp(s, '-?\d+\.?\d*', 'match'); %// extract numbers as a cell array of strings
s = str2double(s); %// convert to numbers 
s = reshape(s.', 4, []).'; %// reshape into four columns in row-mayor order

答案 1 :(得分:0)

另一个答案:

fileID = fopen('mydata.txt');
C = textscan(fileID,'%s %f %s %f %s %f %s %f','delimiter',{',','Row:','max:','rank:','index:'});
fclose(fileID);
C = C(2:2:8);