MatLab - 如何读取由';'分隔的文本文件,列数不同

时间:2013-07-15 15:42:25

标签: matlab text datafeed

我正在尝试读取一个'。'文件,即';'在'标题'和'标题'之后的不同列中用日期分隔。我正在使用HEADER的引号,因为它更像是参数行。

因此,.txt就像(其他行具有相同的列数):

15/07/2013;66;157 
DDD;3;1;0;1;1;1;-0.565
DDD;8;2;0;2;1;1;-0.345 
DDD;9;3;2;3;1;2;-0.643 
DDD;8;1;3;5;1;3;-0.025 
DDD;8;1;0;9;1;4;-0.411 
DDD;15;1;5;4;1;5;-0.09 
DDD;12;1;0;5;1;6;-0.445 
DDD;13;1;0;7;1;7;-0.064

我想阅读并创建一个矩阵,其中包含一个单元格中的每个数据,如:

matrix = 
[15/07/2013 66 157
 DDD 3 1 0 1 1 1 -0,565
 DDD 8 2 0 2 1 1 -0,345
 DDD 9 3 2 3 1 2 -0,643
...]

我尝试过textcan,cvsread,textread,没有任何作用!

提前致谢!

编辑:实际上,我发现了一个WAY FASTER代码来做到这一点!

1 个答案:

答案 0 :(得分:2)

根据我过去的经验,MATLAB不喜欢字符串和数字在同一个矩阵中,因此您将被迫使用单元格。

通过简单的配对,您可以相对轻松地完成此操作。

fid = fopen('temp.txt','r'); %# open file for reading
count = 1;
content = {};
while ~feof(fid)
    line = strtrim(fgets(fid)); %# read line by line
       parts = regexp(line,';','split');
       for i = 1:numel(parts)
             temp = regexp(parts{i},'-?[0-9]*\.?[0-9]*(i|j)?','match');
             if numel(temp) >= 1 && strcmpi(temp{1},parts{i})
                  parts{i} = str2double(parts{i}) ;
             end
       end
       content{count} = parts;
    count = count + 1;
end
fclose(fid);

numRows  = size(content,2)-1;
whole = cell(numRows,8);
for i = 1:numRows
    for j = 1:8
       whole{i,j} = content{i+1}{j};
    end
end
content = {content{1},whole};

更新

我添加了一些东西将所有内容放入单个单元格数组中,所有数据都在标题之外。我不知道你是否将标题也放在那个8列数组中,但如果你这里做的是一些代码来做那个

numRows  = size(content,2);
whole = cell(numRows,8);
for i = 1:numRows
    for j = 1:min([size(content{i},2),8])
       whole{i,j} = content{i}{j};
    end
end
whole