我有一个23k的逐笔逐笔股票市场数据的大数据集,没有以变量名作为头且没有定界符。请查看图片以了解我的数据集。
数据必须分成具有变量名称和长度的列,其长度指定如下
如何将单个列拆分为上述指定列数并在 Matlab Datastore 中处理以提取一些必要的信息?到目前为止,我找不到任何资源。
这是Matlab数据存储库预览命令的屏幕截图:
答案 0 :(得分:0)
您将需要一个自定义函数来读取列分隔的文本文件。这样做的方法很多,有些效率比其他方法高得多。
据我所试验,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);