我有一个大文本文件,其格式如下:
M23 I13 C11 D12 A13
K15 I01 L19 D02 O15
我想将文件读入矩阵,以便逐个处理ID。每行都是独立的。
例如,我希望有一个matlab代码可以执行与以下Perl代码相同的操作:
my @AoA = map { chomp; [ split /\t/, $_ ] } <FILE>;
有人可以帮帮我吗?谢谢!
答案 0 :(得分:0)
这里有两个建议,两个建议都会在最后生成一个完整行的单元格数组。
首先将整个文件加载到内存中,然后将每个变量转换为单元格元素。 这更紧凑。缺点是它在内存中保留了两个数据副本。
第二个版本逐行读取文件,并将每个值转换为单元格元素。 优点是它需要更少的内存,而且似乎更快。
时序:
0.0175769 - 0.00976515 = 0.0078117
或版本1
0.0078117/0.0175769 = 0.44443
慢了。
版本1:
tic;
formatSpec = '%s';
fileID = fopen ('datafile.txt');
C = textscan(fileID,formatSpec,...
'Delimiter', '\n', ...
'CollectOutput', true);
B= C{1};
D = cellfun(@(x) textscan(x, '%s'), B);
toc
D
Elapsed time is 0.0175769 seconds.
D =
{
[1,1] =
{
[1,1] = M23
[2,1] = I13
[3,1] = C11
[4,1] = D12
[5,1] = A13
}
[2,1] =
{
[1,1] = K15
[2,1] = I01
[3,1] = L19
[4,1] = D02
[5,1] = O15
}
}
第2版
tic;
formatSpec = '%s';
fileID = fopen ('datafile.txt');
rowNr = 1;
y=0;
C={};
tline = fgetl(fileID);
while ischar(tline)
A = textscan(tline,formatSpec);
C{rowNr} = A{1};
%Check for end of file
matches = strfind(tline, '\n');
num = length(matches);
if num > 0
y = y + num;
fprintf(1,'%d:%s\n',num,tline);
end
tline = fgetl(fileID);
rowNr = rowNr+1;
end
fclose(fileID);
toc
C
Elapsed time is 0.00976515 seconds.
C =
{
[1,1] =
{
[1,1] = M23
[2,1] = I13
[3,1] = C11
[4,1] = D12
[5,1] = A13
}
[1,2] =
{
[1,1] = K15
[2,1] = I01
[3,1] = L19
[4,1] = D02
[5,1] = O15
}
}