Вам понадобится пользовательская функция для чтения текстовых файлов с разделителями столбцов.Есть много вариантов сделать это, некоторые намного эффективнее других.Насколько я экспериментировал, sscanf
- наиболее эффективная функция для преобразования больших объемов текста в числовые значения, хотя она требует, чтобы значения были разделены пробелами (что требует некоторых выделений и отступов).Следующий код должен работать нормально и настолько быстро, насколько это возможно, без переписывания некоторых частей кода на языке C.
function data=customRead(filename)
%% Define the file format there %%
format = {'Mkt', [1 2], 'str';...
'Seg', [3 6], 'str';...
'OrderNo', [7 22], 'int64';... %(64 bit because int32 has 9 digits max)
'Time', [23 36], 'int64';...
'BSI', [37 37], 'int'}; %The same goes on for other fields
%% Load the file content in memory %%
fid=fopen(filename,'r');
allData=fread(fid,Inf,'*uint8');
fclose(fid);
%% Make it an array, with one line from the dat file in each row %%
bytesPerLine = 87; % 86 bytes + 1 newline (or is it 2 for \r\n ?)
nLines = length(allData)/bytesPerLine;
allData=char(reshape(allData,[bytesPerLine,nLines])'); %Each line of the input is now stored in a row
%% Loop over format fields and populate the output structure
for ii=1:size(format,2)
thisData= allData(format{ii,2},:); %select range from char array
switch format{ii,3}
case 'str'
% cast to string
data.(format{ii,1})=string(thisData);
case 'int'
thisData = [thisData,repmat(' ',[nLines,1])]'; %pad with a space after each value and transpose
thisData = thisData(:); %make it a vector
data.(format{ii,1})=int32(sscanf(thisData,'%d')); %read with sscanf (this is fast)
case 'int64'
thisData = [thisData,repmat(' ',[nLines,1])]';
thisData = thisData(:)';
data.(format{ii,1})=sscanf(thisData,'%li'); % %li to read as int64
otherwise
error('%s : unknown format %s',format{ii,1},format{ii,3});
end
end
end
В результате получается структура, каждое поле которой представляет собой вектор-столбец string , int32 или int64
Затем можно определить хранилище данных с помощью пользовательской функции:
store = fileDatastore(location,'ReadFcn',@customRead);