在块MATLAB中读取文本文件

时间:2017-11-30 19:22:58

标签: arrays matlab text-files

我的任务是阅读文本文件,以便使用MATLAB进行进一步的计算工作。所以,我的问题是如何读取文本数据并将值保存到变量中作为示例:

A= [vertical angles]; B= [Horizontal angles]; C= [vertical data];

我尝试了 dlmwrite 这个函数

M = dlmread(filename,'/t ',2,0)

a=M(2:3);     ver=M([5:a(1)+4]); 

hor = M([a(1)+4:a(2)+a(1)]);...

但是dlmread()成功读取了文件大小的一半。

我还尝试使用带有textscan()循环的 while 函数来阅读该文件。结果是在Cell数组中,这让我不知道如何根据我的要求分开

file =fopen(filename);
line = fgets(file);
data={};
a=1;
while ischar(line)
    ar=textscan(line,'%f');
for i = 1:length(n)
    data{i,a}=ar{i};
end
line=fgets(file);
a=a+1;
end

以下是文本文件顺序的示例,我的分配中使用的文件按数组大小的顺序data =(1500x1800)......

NAME
PRODUCT
0 24 30 2    % Here 24,30 denotes the vertical and horizontal data which can be considered as Matrix size %
20 21 22 44 25 56 78 79 89 29 59 14   %% vertical angles length(vector)=25
20.5 20.6 20.7 20.9 30 30.9 81 91
15 19 16 18 5     
10 12 13 16 17 18 19 18 20 16 18 15   %% Horizontal angles length(vector)=29
20.6 20.7 20.8 15 14 16 18 19 20 30.5
19 20 16 15.6 18 19 20                
80 51 22 34 25 56 78 29 59 29 59 14   %% here starts the vertical data i.e length of vector 25
20.3 20.6 20.8 20.9 36 30.9 81 91
15 15 18 16 5                        
.
.
.
No. of horizontal i.e 29

1 个答案:

答案 0 :(得分:1)

如果我理解你的需要,那么这不是很优雅,而是必须做的事情:

values = [];
vert_len = NaN;
horz_len = NaN;

offset = 1;
values_offset = 1;

fid = fopen('myfile.txt');
line = fgetl(fid);

while (ischar(line))

    line = strtrim(line);

    switch (offset)
        case {1 2}

        case 3
            split = strsplit(line,' ');
            header = sscanf(sprintf('%s*',split{:}),'%f*');
            vert_len = header(2);
            horz_len = header(3);

        otherwise
            split = strsplit(line,' ');
            values_line = sscanf(sprintf('%s*',split{:}),'%f*'); 
            values = [values; values_line];

    end

    line = fgets(fid);  
    offset = offset + 1;

end

A = values(1:vert_len);

B_offset_1 = vert_len + 1;
B_offset_2 = B_offset_1 + horz_len - 1;
B = values(B_offset_1:B_offset_2);

C = values(B_offset_2+1:end);

sscanf(sprintf('%s*',mycell{:}),'%f*')

是将字符串转换为double的最快的已知方法之一。

这是我使用的模板(你的模板,通过修复,仍然是错误的):

NAME
PRODUCT
0 25 29 2
20 21 22 44 25 56 78 79 89 29 59 14
20.5 20.6 20.7 20.9 30 30.9 81 91
15 19 16 18 5     
10 12 13 16 17 18 19 18 20 16 18 15
20.6 20.7 20.8 15 14 16 18 19 20 30.5
19 20 16 15.6 18 19 20                
80 51 22 34 25 56 78 29 59 29 59 14
20.3 20.6 20.8 20.9 36 30.9 81 91
15 15 18 16 5