Matlab如何将txt数据文件读入工作空间

时间:2016-10-13 22:43:24

标签: matlab

txt文件按以下格式组织:

image filename
n (number of objects of interest in the image) 
bounding box for object 1
bounding box for object 2
...
bounding box for object n

例如,txt文件中的内容如下所示:

images/1.jpg
1
39.284331   23.721327   88.000000   135.915360
images/2.jpg
4
107.912089  129.898400  62.372022   89.263200
186.266100  61.768245   64.831800   106.847910
298.909724  34.289100   73.830894   105.977200
135.454600  -63.205613  109.739600  176.375026
images/3.jpg
2
136.462492  18.762699   121.522126  187.348778
333.601798  18.139177   104.944018  155.239682

我现在想要将文件读入一个结构数据(N * 1,其中N等于图像数),其中包含三个字段,文件名,对象数和边界框。有没有一种有效的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

没有一种简单的方法来解析文件并保留标题。您可以使用textscan来获取每个条目的数据,但是您没有获得标题。这可能满足您的需求,但我猜测您会想要相应边界框的文件名。有关此问题的Mathworks文档可以在here找到。在您的情况下,可以使用

轻松解析

A = textscan(fid,'%f %f %f %f','HeaderLines',2)
然后可以重复此操作,直到您到达文件末尾。

或者,您可以将fgetltextscan结合使用来首先解析标头,然后读取块数据。下面是一个实现。请注意,下面的实现假设每个块一个接一个地出现,没有空格。您可能希望根据用例添加更强大的功能。

function [ data ] = parseTestSO( filename )

fid = fopen(filename);
% automatically close the file when cleanupFunction goes out of scope
cleanupFunction = onCleanup(@()fclose(fid));

% define the struct

n = 1;
while ~feof(fid) % repeat the read until all entries are parsed
    data(n).filename = fgetl(fid); % gets the filename
    data(n).numEntries = str2double(fgetl(fid)); % gets the number of entries
    tempVal = textscan(fid,'%f %f %f %f'); % read formatted data block until next non-matching line

    data(n).values = [tempVal{:}]; % transform the returned cell array into an nx4 array
   n = n+1;
end
end

答案 1 :(得分:0)

fileID = fopen('yourfile.txt','rt');
data = textscan(fileID,'%s','delimiter','\n');
C = data{1} ;
fclose(fileID);
IdxC = strfind(C, 'images');
Idx = find(not(cellfun('isempty', IdxC)));
nimages = length(Idx) ; % total number of images 
iwant = struct ;    % initialize structure

for i = 1:nimages-1
    iwant(i).name = C{Idx(i)} ;
    iwant(i).no_objects = str2num(C{Idx(i)+1}) ;
    iwant(i).bounding_box = C((Idx(i)+2):(Idx(i+1)-1)) ;
end

iwant(nimages).name = C(Idx(nimages)) ;
iwant(nimages).no_objects = C(Idx(nimages)+1) ;
iwant(nimages).bounding_box = C(Idx(nimages)+2:end) ;