Я хотел бы прочитать (довольно большой) файл журнала в строковую ячейку MATLAB за один шаг.Я использовал обычные:
s={};
fid = fopen('test.txt');
tline = fgetl(fid);
while ischar(tline)
s=[s;tline];
tline = fgetl(fid);
end
, но это только медленно.Я обнаружил, что
fid = fopen('test.txt');
x=fread(fid,'*char');
намного быстрее, но я получаю матрицу nx1
char, x
.Я мог бы попытаться преобразовать x
в строковую ячейку, но затем я попал в ад кодирования символов;Кажется, что разделитель строк равен \ n \ r, или 10 и 56 в ASCII (я посмотрел в конце первой строки), но эти два символа часто не следуют друг за другом и даже показываютиногда соло.
Существует ли простой быстрый способ прочитать файл ASCII в строковую ячейку за один шаг или преобразовать x
в строковую ячейку?
Чтение с помощью fgetl:
Code Calls Total Time % Time
tline = lower(fgetl(fid)); 903113 14.907 s 61.2%
Чтение через fread:
>> tic;for i=1:length(files), fid = open(files(i).name);x=fread(fid,'*char*1');fclose(fid); end; toc
Elapsed time is 0.208614 seconds.
Я проверил предварительное распределение, и это не помогает: (
files=dir('.');
tic
for i=1:length(files),
if files(i).isdir || isempty(strfind(files(i).name,'.log')), continue; end
%# preassign s to some large cell array
sizS = 50000;
s=cell(sizS,1);
lineCt = 1;
fid = fopen(files(i).name);
tline = fgetl(fid);
while ischar(tline)
s{lineCt} = tline;
lineCt = lineCt + 1;
%# grow s if necessary
if lineCt > sizS
s = [s;cell(sizS,1)];
sizS = sizS + sizS;
end
tline = fgetl(fid);
end
%# remove empty entries in s
s(lineCt:end) = [];
end
toc
Истекшее время составляет 12,741492 секунды.
Примерно в 10 раз быстрее, чем оригинал:
s = textscan(fid, '%s', 'Delimiter', '\n', 'whitespace', '', 'bufsize', files(i).bytes);
Мне пришлось установить 'whitespace'
на ''
, чтобы сохранить начальные пробелы (которые мне нужны для разбора), и 'bufsize'к размеру файла (по умолчанию 4000 выдает ошибку переполнения буфера).