如何充分利用readtable

发布时间:2023-05-21

一、CSV文件的读取

readtable 是 MATLAB 中强大的数据导入函数之一。它可以读取各种文件形式(如 CSV,TXT 等等)的表格数据。对于 CSV 文件而言,readtable 可以做到很好的读取,特别是一些具有复杂表头的 CSV 文件。

% 读取具有表头的CSV文件
filename = 'example.csv';
opts = detectImportOptions(filename);
data = readtable(filename, opts);

在这个例子中,MATLAB 会自动检测 CSV 文件中的数据类型,并将它们读入一个名为 datatable 类型变量中。特别的,opts 的选项可以实现对表头的读取。当选项 detectImportOptions 检测到表头时,就会将其解析为 MATLAB 的变量名。

二、csvread 与 readtable 的比较

csvread 是 MATLAB 中读取 CSV 文件的另一种方法。在读取 csv 文件时,通常会先想到 csvread 函数。但是,在面对复杂表头、缺失值等问题时,csvread 的局限性便会显露。这时,使用 readtable 便能够产生很好的效果。

% csvread 示例代码
A = csvread('example.csv', 1, 0);

csvread 函数读取 CSV 文件时,默认所有数据类型为 double。因此,读取到的 CSV 文件被强制转换为数值类型。相比之下,当使用 readtable 函数时,MATLAB 可以在运行时加载数据,从而将不同的数据类型转换为单独的列。此外,readtable 函数还可以处理较大的数据集(即 1e5 行或更多)。

三、导入结构体数组

另外,readtable 不仅可以读取表格数据,还可以将其中非表格数据转换为结构体数组。这个特性对于将各种输出格式整合为一种实用的输出格式时非常有用。例如,下面代码示例将导入一个包含身高、体重和 BMI 的数据集,该数据集以结构体数组的形式存在。

% 导入结构体数组
filename = 'example_data.csv';
opts = detectImportOptions(filename, 'FileType', 'text');
opts.DataLines = [2, Inf];
opts.VariableTypes = {'string', 'double', 'double'};
opts.VariableNames = {'Name', 'Height', 'Weight'};
data = readtable(filename, opts);
people = struct('Name', cellstr(data.Name), 'Height', data.Height, 'Weight', data.Weight);
for i = 1:length(people)
    people(i).BMI = people(i).Weight / ((people(i).Height/100)^2);
end

四、处理缺失值

在实际数据处理中,缺失值是经常出现的问题。readtable 可以很好地处理这种情况。默认情况下,readtable 会自动将缺失值标记为 NaN

% 处理缺失值的示例代码
filename = 'example.csv';
opts = detectImportOptions(filename);
opts = setvartype(opts, {'col_1', 'col_2'}, 'double');
opts.MissingRule = 'fill';
opts = setvaropts(opts, 'col_3', 'FillValue', 0);
data = readtable(filename, opts);

在这个例子中,我们将 col_1col_2 的数据类型设置为 double,将缺失值的处理规则设置为填充(MissingRule = 'fill')。另外,我们将 col_3 的填充值设置为 0。这些选项都控制了 readtable 如何处理缺失值。

五、读取大型文件

在处理大型文件时,readtable 的性能也很高。同时,readtable 也支持自动化并行处理(Parallel Computing Toolbox)。这意味着 readtable 可以将 CSV 文件自动分割成更小的数据块,然后并行处理这些数据块。

% 读取大型文件的示例代码
filename = 'large_file.csv';
opts = delimitedTextImportOptions('DataLines',[2, Inf]);
opts = setvaropts(opts, 'Column1', 'TrimNonNumeric', true);
opts = setvaropts(opts, 'Column2', 'TrimNonNumeric', true);
opts.SelectedVariableNames = {'Column1', 'Column2'};
% 使用并行 computing toolbox
tStart = tic;
data = readtable(filename, opts, 'UseParallel', true);
toc(tStart)

在这个例子中,我们使用选项 delimitedTextImportOptions 限制仅导入数据。然后,我们针对 Column1Column2 设置了选项 TrimNonNumeric 用于修整非数值类型的数据,避免后期错误。最后,我们通过设置 UseParallel 来使用并行计算。

六、readtable 的局限性

在处理结构化数据时,readtable 非常适合。而对于非规则结构的数据(如文本数据或像素数据),则要使用 MATLAB 中其他函数(如 fread 函数)来处理。 此外,当 CSV 文件中存在较长的注释字符串时,readtable 的解析速度也会变得非常慢。在这种情况下,需要手动处理字符串,使用正则表达式来解析注释字符串。