MATLAB如何使用 readtable 优化百万级别CSV文件的读取速度
MATLAB如何使用 readtable 优化百万级别CSV文件的读取速度
在处理大量CSV数据时,如何提高读取速度和处理效率是一个常见的问题。本文将介绍如何使用MATLAB的readtable函数优化百万级别CSV文件的读取速度,包括读取数据、处理日期列、转换分类数据、合并结果以及删除重复行等步骤。
前言
用于处理位于指定目录下的多个CSV文件,通过读取数据、处理日期列、转换分类数据、合并结果以及删除重复行,最终将处理后的数据保存为MAT文件。使用 readtable 读取数据,以提高读取效率,并通过向量化操作和逻辑索引提高代码效率。
方法 | 适用情况 | 速度 | 解析能力 |
---|---|---|---|
readmatrix | 纯数值数据 | 🚀 快 | ❌ 不支持文本 |
readcell | 混合数据(文本+数值+日期) | 🐢 慢 | ✅ 保留原始数据 |
readtable | 混合数据,返回表格数据 | ⚖️ 适中 | ✅ 强大 |
代码实现
% ✅ 设置主目录路径,指向包含CSV文件的文件夹
mainFolder = '\CSV\';
% ✅ 获取主目录下的所有CSV文件
csvFiles = dir(fullfile(mainFolder, '*.csv'));
% ✅ 初始化一个空数组,用于存储所有CSV文件的处理结果
allData = [];
% ✅ 遍历所有CSV文件
for i = 1:length(csvFiles)
% 获取当前CSV文件的完整路径
csvFilePath = fullfile(mainFolder, csvFiles(i).name);
% ✅ 使用 readtable 读取CSV文件,'PreserveVariableNames' 保留变量名
T = readtable(csvFilePath, 'PreserveVariableNames', true);
% ✅ 确保数据非空,并且列数足够(至少14列)
if isempty(T) || size(T, 2) < 14
continue; % 跳过不符合要求的文件
end
% ✅ 处理第6列(日期列),转换为 YYYYMMDD 格式
% 判断日期列是字符串还是 datetime 类型,进行相应转换
if iscell(T{:,6}) % 如果日期列是字符串格式
dateCol = datetime(T{:,6}, 'InputFormat', 'yyyy/MM/dd', 'Format', 'yyyyMMdd'); % 转换为 datetime
else % 如果已经是 datetime 类型
dateCol = T{:,6}; % 直接使用原数据
end
% ✅ 将日期列转换为 YYYYMMDD 格式
formattedDate = year(dateCol) * 10000 + month(dateCol) * 100 + day(dateCol);
% ✅ 处理第14列(分类数据),将 'D' 转换为 1,'N' 转换为 2
classCol = strings(size(T,1),1); % 预分配字符串数组
classCol(strcmp(T{:,14}, 'D')) = "1"; % 'D' 对应 1
classCol(strcmp(T{:,14}, 'N')) = "2"; % 'N' 对应 2
classCol = str2double(classCol); % 将字符串转换为数值
% ✅ 仅保留需要的列 (第1, 2, 6, 7, 13, 14列)
selectedData = [T{:,1}, T{:,2}, formattedDate, T{:,7}, T{:,13}, classCol];
% ✅ 将当前文件的处理结果追加到 allData 数组中
allData = [allData; selectedData];
% ✅ 生成保存MAT文件的路径,替换文件扩展名为 .mat
matFileName = fullfile(mainFolder, replace(csvFiles(i).name, '.csv', '.mat'));
% ✅ 保存处理后的数据到MAT文件
save(matFileName, 'selectedData');
% ✅ 输出处理信息,确认文件已保存
fprintf('已处理并保存: %s\n', matFileName);
end
% ✅ 删除 allData 中的重复行
[allDataunique, ~, ~] = unique(allData, 'rows'); % 使用 unique 函数按行去重
% ✅ 生成合并后的MAT文件名
mergedMatFile = fullfile(mainFolder, 'merged_data.mat');
% ✅ 将去重后的数据保存到一个新的 MAT 文件
save(mergedMatFile, 'allDataunique');
% ✅ 输出所有文件处理完成的信息
disp('所有文件处理完成!');
总结
设置主目录路径:指定存放CSV文件的文件夹路径。
获取CSV文件列表:使用 dir 函数获取该文件夹中所有CSV文件的名称。
初始化数据存储容器:allData 用于存储所有处理后的数据。
遍历CSV文件:循环处理每个CSV文件,逐个读取文件并进行数据处理。
读取数据:使用 readtable 函数读取CSV文件,参数 PreserveVariableNames 保证读取时保留原始列名。
检查数据有效性:如果表格为空或列数不足(小于14列),跳过该文件。
日期列处理:通过判断日期列是否为字符串格式或已是 datetime 类型,分别进行相应的转换。
日期格式转换:将日期列转换为 YYYYMMDD 格式,方便后续处理。
处理分类数据:将第14列中的 ‘D’ 转换为数值 1,‘N’ 转换为数值 2。其他值转换为 NaN。
选择所需的列:从表格中提取所需的列,形成新的数据集 selectedData。
数据拼接:将当前文件的处理结果追加到 allData 数组中,累计处理所有文件的数据。
保存数据到MAT文件:为每个CSV文件生成一个 .mat 文件并保存数据。
删除重复行:使用 unique 函数去除 allData 中的重复行,保证数据的唯一性。
保存合并后的数据:将去重后的数据保存为一个新的 .mat 文件。
输出处理完成信息:在处理完成后,输出提示信息,确保用户知道数据已处理完毕。